JVM内存模型

2023-08-26  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读