JVM整体内存模型
2021-08-18 18:05:32 0 举报
JVM完整内存模型
作者其他创作
大纲/内容
寄存器分配
Y
空闲列表
S0
AGE达到阈值放入老年代
创建对象时
getClass
TLAB
对象
新生代-Xmn
数组长度
分配内存
执行引擎
STW
不在栈上分配时往堆中分配
大对象?
开启逃逸分析
栈
N
END
gc
S1
动态链接
开始栈上分配
栈-Xss
栈桢分配
线程3
内存不规整
有数组时:4b
放入S1
有列表记录那些内存块是可用的
执行方法时
gc后S0存活的对象
内存分配流程
运行时数据区
老年代的可剩余的空间 < 新生代所有对象总和(包括垃圾对象)
放入S1触发对象动态年龄判断
通过CAS失败重试的分配
从历史minorGc后放入老年代对象大小的平均值比现有老年代的空间小,则理论上证明应该可以容纳本次minorGc后放入老年代的对象总大小,所以可以正常进行minorgc,不需要执行full gc
Eden
为每一个线程分配一块可缓冲的内存区域,自己的线程就在这一块上分配空间,并且一个线程的TLAB是规则的,就不会有并发问题,而且分配的效率很高
老年代可剩余空间总和 < 历史从年轻代minorGC后放入老年代对象的大小的平均值
-XX:+DoEscapeAnalysis
初始化零值
-XX:-HandlePromotionFailure
CAS
局部变量表
执行MinorGC
minorGC
TLAB?
MarkWord
FGC
Klass Point类型指针
Kalss Point类型指针
默认条件:内存规整
触发了对象动态年龄判断进入老年代
方法区-XX:MaxMetaspaceSize
空间交换,情况Eden和S0
堆-Xms/-Xmx
MinorGc之前触发老年代空间担保机制
存活的对象
配置了
执行方法
操作数栈
并发解决方式2
是
执行Init方法
Full GC
对齐填充:对象长度为非8的倍数时填充为8的倍数
堆
年轻代 3/1
内存区域
从历史minorGc后放入老年代对象的大小来看,老年代可能放不下,所以执行full gc来释放空间
新生代
Y:分配到伊甸区
并发解决方式1
栈上分配
实例数据:
负责修改寄存器位置
是否触发GC?
没配置
设置对象头
判断类是否已加载
线程栈
如果放入S1区的对象的年龄总和的对象大小大于了S1空间的50%,那么会触发对象动态年龄判断,直接放入老年代
开启标量替换
32:4b64:8b
老年代
AGE?
指针碰撞
完整对象
已使用
双亲委派+全盘委托
加载类
方法出口
默认是TLAB
指针压缩为4b非压缩为8b
老年代空间担保机制
gc后Eden中存活的对象
线程1
markword
MinorGC?
线程2
MinorGC
指针碰撞点
未使用
老年代2/3
对象头
类加载子系统
-XX:+EliminateAllocations
本地方法栈
栈桢
栈内分配
程序计数器PC寄存器
元空间
赋值+静态代码调用+构造方法调用
线程4
0 条评论
下一页
为你推荐
查看更多