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就直接把该大,
对象放入老年代,而不会经过新生代;
 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论

打赏作者

zz好好学java

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值