JVM_03-2对象内存分配
2022-09-06 10:30:49 0 举报
AI智能生成
JVM_03-2对象内存分配
作者其他创作
大纲/内容
对象内存分配
对象内存分配流程图
对象栈上分配
逃逸分析
没有逃逸出方法的对象可以直接分配在栈内存里,当方法结束时跟随栈内存一起被回收掉。
JDK7之后默认开启逃逸分析,如果要关闭使用参数(-XX:-DoEscapeAnalysis)
开启逃逸分析参数(-XX:+DoEscapeAnalysis)
标量替换
通过逃逸分析确定该对象不会被外部访问
并且对象可以被进一步分解时
JVM不会创建该对象,而是将该对象成员变量分解若干个被这个方法使用的成员变量所代替
这些代替的成员变量在栈帧或寄存器上分配空间,这样就不会因为没有一大块连续空间导致对象内存不够分配
对象在Eden区分配
大多数情况下,对象在新生代中 Eden 区分配
Eden 区没有足够空间进行分配
发起一次Minor GC
Minor GC/Young GC
指发生新生代的的垃圾收集动作,Minor GC非常频繁,回收速度一般也比较快
Major GC/Full GC
一般会回收老年代 ,年轻代,方法区的垃圾,Major GC的速度一般会比Minor GC的慢10倍以上
Eden与Survivor区默认8:1:1
大对象直接进入老年代
参数 -XX:PretenureSizeThreshold 可以设置大对象的大小
参数只在 Serial 和ParNew两个收集器下有效
G1有单独的大对象定义
大对象尽早的进入老年代,要不然在年轻代挪过来挪过去,会造成年轻代不够用频繁的GC
长期存活的对象将进入老年代
每一个对象年龄有(Age)计数器。
如果对象在 Eden 出生并经过第一次 Minor GC 后仍然能够存活,并且能被 Survivor 容纳的话,将被移动到 Survivor 空间中
将对象年龄设为1
对象在 Survivor 中每熬过一次 MinorGC
年龄就增加1岁
它的年龄增加到一定程度,就会被晋升到老年代中
默认为15岁
CMS收集器默认6岁
不同的垃圾收集器会略微有点不同
参数 -XX:MaxTenuringThreshold
设置晋升到老年代的年龄阈值
对象动态年龄判断
老年代空间分配担保机制
0 条评论
下一页