JVM垃圾回收什么情况会进入老年代


 

新生代Minor GC后剩余存活对象太多,无法放入Survivor区中,此时就必须将这些存活对
象直接转移到老年代去,如果此时老年代空间也不够怎么办?
1、执行任何一次Minor GC之前,JVM会先检查一下老年代可用内存空间,是否大于新生代
所有对象的总大小,因为在极端情况下,可能新生代Minor GC之后,新生代所有对象都需要
存活,那就会造成新生代所有对象全部要进入老年代;
2、如果老年代的可用内存大于新生代所有对象总大小,此时就可以放心大胆的对新生代发起
一次Minor GC,因为 Minor GC之后即使所有对象都存活,Survivor区放不下了,也可以转
移到老年代去;
3、如果执行MInor GC之前,检测发现老年代的可用空间已经小于新生代的全部对象总大小,
那么就会进行下一个判断,判断老年代的可用空间大小,是否大于之前每一次Minor GC后进
入老年代的对象的平均大小,如果判断发现老年代的内存大小,大于之前每一次Minor GC
后进入老年代的对象的平均大小,那么就是说可以冒险尝试一下Minor GC,但是此时真的可
能有风险,那就是Minor GC过后,剩余的存活对象的大小,大于Survivor空间的大小,也
大于老年代可用空间的大小,老年代都放不下这些存活对象了,此时就会触发一次“Full GC";
所以老年代空间分配担保机制的目的?也是为了避免频繁进行Full GC;
4、如果Full GC之后,老年代还是没有足够的空间存放Minor GC过后的剩余存活对象,那
么此时就会导致“OOM”内存溢出;

什么情况下对象会进入老年代
 1、躲过15次GC之后进入老年代,I可通过JVM参数"-XX:MaxTenuring Threshold" 来设置年龄,默认为15岁;
2、动态对象年龄判断;
3、老年代空间担保机制;
4、大对象直接进入老年代;

大对象是指需要大量连续内存空间的Java对象,比如很长的字符串或者是很大的数组或者
List集合,大对象在分配空间时,容易导致内存明明还有不少空间时就提前触发垃圾回收以
获得足够的连续空间来存放它们,而当复制对象时,大对象又会引起高额的内存复制开销,为
了避免新生代里出现那些大对象,然后屡次躲过GC而进行来回复制,此时JVM就直接把该大,
对象放入老年代,而不会经过新生代;
 

你可能感兴趣的:(java,开发语言)