美文网首页
JVM内存模型

JVM内存模型

作者: 垂直居中的句号 | 来源:发表于2023-08-26 23:36 被阅读0次

    (线程独享)
    1、程序计数器:当前线程所执行的字节码的行号指示器,存放下一条指令所在单元的地址,当执行一条指令时,首先需要根据PC中存放的指令地址,将指令由内存取到(指令寄存器)中,此过程称为“取指令”。与此同时,PC中的地址或自动加1或由转移指针给出下一条指令的地址。此后经过分析指令,执行指令。完成第一条指令的执行,而后根据PC取出第二条指令的地址,如此循环,执行每一条指令。

    2、虚拟机栈: 每个线程有一个虚拟机栈,线程的每个方法会分配一块栈帧,栈帧中包括:
    局部变量表(存储基本数据类型或引用数据类型)、
    操作数栈(操作数运算时一块临时的空间来存放操作数)、
    动态链接(将代码中符号引用转换为方法区中运行时常量池的直接引用)、
    方法出口(存储方法执行完后回到上一层方法的位置)

    3、本地方法栈
    本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java 方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native 方法服务。

    (线程共享)
    4、方法区
    主要包括:常量、静态变量、类信息、运行时常量池,操作的是直接内存。
    5、堆
    此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。堆是垃圾收集器管理的主要区域。
    如果从内存回收的角度看,由于现在收集器基本都是采用的分代收集算法,所以Java 堆中还可以细分为:新生代和老年代;

    新生代:程序新创建的对象都是从新生代分配内存,新生代由Eden Space和两块相同大小的Survivor Space(通常又称S0和S1或From和To)构成,可通过-Xmn参数来指定新生代的大小,也可以通过-XX:SurvivorRation来调整Eden Space及Survivor Space的大小。

    老年代:用于存放经过多次新生代GC仍然存活的对象,例如缓存对象,新建的对象也有可能直接进入老年代,主要有两种情况:1、大对象,可通过启动参数设置-XX:PretenureSizeThreshold=1024(单位为字节,默 认为0)来代表超过多大时就不在新生代分配,而是直接在老年代分配。2、大的数组对象,且数组中无引用外部对象。

    老年代所占的内存大小为-Xmx对应的值减去-Xmn对应的值。

    stackOverflow栈溢出
    https://www.cnblogs.com/mikechenshare/p/16562589.html

    https://blog.csdn.net/weixin_48268269/article/details/125534970?ydreferer=aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODI2ODI2OS9hcnRpY2xlL2RldGFpbHMvMTI1NTM0OTcw

    https://baijiahao.baidu.com/s?id=1709435405507347362&wfr=spider&for=pc

    相关文章

      网友评论

          本文标题:JVM内存模型

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