美文网首页
JVM 2020-11-30

JVM 2020-11-30

作者: _一叶孤帆 | 来源:发表于2020-11-30 17:54 被阅读0次

    每个线程独享的区域:
    程序计数器、虚拟机栈、本地方法栈

    程序计数器:

    当进行 CPU 调度的时候,用来记录当前线程的执行进度。

    虚拟机栈:

    默认大小为 1M (参数名为 -Xss)
    - 栈帧:
    栈帧包括:
    局部变量表 存储基本八大类型 + 引用
    操作数栈 存储方法执行
    动态连结 多态:静态分派、动态分派
    完成出口

    Java 的解释执行是基于栈(操作数栈),兼容性好,效率偏低(相比硬件)
    C 是基于寄存器(硬件)运算,移植性差,

    本地方法栈

    保存的是 native 方法的信息。

    [图片上传失败...(image-645730-1606721015410)]

    带有 native 标记的方法,利用 C 语言实现的。

    当一个JVM 创建的线程调用 native 方法后,JVM 不再为其在虚拟机栈中创建栈帧,只是简单的动态链接并直接调用 native 方法。

    程序共享的区域

    为什么需要两部分(堆和方法区)?

    堆中的东西都需要频繁的回收
    方法区的内容是不需要频繁的回收

    方法区

    类信息
    常量
    静态变量
    即时编译器编译后的代码

    <= 1.7 永久代

    = 1.8 元空间 方便拓展 挤压堆空间

    对象
    数组

    java 堆内存参数配置

    -xmx 堆内存分配最大上限
    -xms 堆内存初始内存大小

    直接内存 (堆外内存)

    方法区的内容是回收的还是较少回收的?
    堆外内存 NIO ?

    内存溢出

    • 栈溢出
    • 堆溢出
    • 方法区溢出
    • 直接内存溢出

    虚拟机优化

    方法内联

    栈帧之间数据共享

    类的卸载

    1. 类所有实例全被回收
    2. 加载该类的 classload 已经被回收
    3. 该类 java.lang.class 对象 没有任何地方被引用。无法通过反射去访问该类的方法。

    满足以上可被回收。

    可配参数 -Xnoclassgc,开启此参数,就不会被回收。

    相关文章

      网友评论

          本文标题:JVM 2020-11-30

          本文链接:https://www.haomeiwen.com/subject/ahgrwktx.html