JVM学习2021-02-23

本文解析了Java中Minor GC何时触发,条件及过程,包括空间检查、空间担保策略、Full GC的触发时机,并探讨了Minor GC后的内存流向。还介绍了如何检查老年代空间和对象大小,以及对象晋升到老年代的条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Q:到底什么时候会尝试触发Minor GC?

R:Eden区和存对象的Survivor区满的时候触发Minor GC

触发Minor GC情况有:

检查新生代对所有对象所占空间是否大于老年代可用空间,如果小于,则Minor GC

如果大于,查看“-XX:-HandlePromotionFailure”是否设置。

如果没设置,进行Full GC。

如果设置,判断老年代空间是否大于之前Minor GC后进入老年代对象的平均大小。如果大于,进行Minor GC,如果小于进行Full GC。

 

Q:触发Minor GC之前会如何检查老年代可用内存大小和新生代对象大小?

R:1.判断新生代存活是否大于老年代剩余

2.条件1成立且设置了空间担保的情况下,判断老年代剩余是否大于之前进入老年代平均存活大小。

 

Q:什么时候再Minor GC之前就会提前触发一次Full GC?

R:新生代现有存活对象>老年代剩余内存情况下,设置空间担保 “-XX:-HandlePromotionFailure”,老年代可用空间大于之前每次Minor GC后进入老年代的平均大小。就会先Full GC再Minor GC。

 

Q:Full GC的算法是什么?

R:标记整理算法,老年代对象存活时间较长,赋值算法不太合适,标记-清理算法会产生内存碎片。标记整理可以规避。

 

Q:Minor GC过后可能对应几种情况?

R:1、小于Survivor区域,进入Survivor区域

2、大于Survivor区域,小于老年代可用内存,进入老年代

3、大于Survivor区域,大于老年代可用内存,进行Full GC,如果Full GC 后老年代可用内存依旧小于存活对象,抛出OOM即堆内存空间不足,堆内存溢出。

 

Q:如何检查老年代可用内存大小和历次Minor GC之后升入老年代的平均对象大小?

R:

 

Q:什么情况下Minor GC后会直接进入老年代

R:Survivor区域<存活对象占用空间 && 老年代可用空间<存活对象占用空间

经过XX:MaxTenuringThreshold  次 M

 

 

每次Minor GC 前直接检查新生代全部对象的大小是否小于老年代可用内存大小。

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值