对象内存分配
2021-10-17 11:45:53 0 举报
对象内存分配
作者其他创作
大纲/内容
栈上分配的好处就是我们的方法在栈上分配好,等方法执行完成之后就会从栈中弹出。
标量替换就是说像类似于User这样的对象的话,当我们要在栈上分配的时候,其实我们是不会直接存放这整个对象的,而是存放它的属性,以此来减少内存空间的占用。开启标量替换参数(-XX:+EliminateAllocations)
否
老年代空间分配担保机制
S0区
为什么要栈上分配
1、大对象直接进入老年代
什么对象会进入老年代?
是
S1区
Eden区
Y
栈内分配?
是否开启 -XX:-HandlePromotionFailure
POP()
老年代剩余的内存空间大小是否大于新生代所有对象(包括垃圾对象)
主要是为了减少一次Minor GC所带来的性能消耗
栈
N
Minor GC
使用栈上分配主要是为了解决像test02()这样的方法,他们不会发生逃逸,所以说用完之后就没有别的对象进行引用,也就是会成为垃圾对象,所以说为了减少内存的压力,就会在栈上进行分配。JVM对于这种情况可以通过开启逃逸分析参数(-XX:+DoEscapeAnalysis)来优化对象内存分配位置,使其通过标量替换优先分配在栈上(栈上分配),JDK7之后默认开启逃逸分析,如果要关闭使用参数(-XX:-DoEscapeAnalysis)
大对象就是需要大量连续内存空间的对象。JVM参数 -XX:PretenureSizeThreshold 可以设置大对象的大小,如果对象超过设置的值的话,就直接进入老年代。这个参数只在 Serial 和ParNew两个收集器下有效
目的
new X()
像test01()方法,当外界调用这个方法的时候它最后会返回一个user对象,所以这就是发生了逃逸;而像test02()方法那样,当外界调用它的时候,它不会返回一个对象,所以就不会发生逃逸。
Full GC
START
Minor GC之前
Minor GC和Full GC 有什么不同呢?Minor GC/Young GC:指发生新生代的的垃圾收集动作,Minor GC非常频繁,回收速度一般也比较快。Major GC/Full GC:一般会回收老年代 ,年轻代,方法区的垃圾,Major GC的速度一般会比Minor GC的慢10倍以上。Eden与Survivor区默认8:1:1JVM默认有这个参数-XX:+UseAdaptiveSizePolicy(默认开启),会导致这个8:1:1比例自动变化,如果不想这个比例有变化可以设置参数-XX:-UseAdaptiveSizePolicy
老年代
age?
TLAB
老年代剩余空间是否大于历次Minor GC后进入老年代的平均对象大小
大对象?
大对象直接进入老年代,目的是为了避免大对象分配内存时在S0区和S1区的频繁复制操作而降低效率。
3、对象动态年龄判断:当年龄1+年龄2+...+年龄n的对象占的内存超过了S0或S1区的50%,就直接进入老年代
参数
2、当分代年龄大于等于15的时候,进入老年代,通过参数 -XX:MaxTenuringThreshold 来设置分代年龄
0 条评论
下一页