条件"/>
JVM young gc和full gc触发条件
- young gc:
Eden区可用内存不足
- full gc:
- 老年代达到某一阈值(默认92%)
- 方法区可用内存不足
- 在young gc之前,会先检查老年代最大可用的连续空间是否大于新生代所有对象的总空间。如果小于,说明YGC是不安全的,则会查看参数 HandlePromotionFailure 是否被设置成了允许担保失败,如果不允许则直接触发Full GC;如果允许,那么会进一步检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果小于会触发 Full GC;大于则会执行young gc(即使是不安全,有可能young gc后进入老年代的对象内存仍然大于老年代可用内存,此时会报内存溢出错误)
- 显式调用System.gc() 或者Runtime.gc()
存活对象进入老年代的条件:
- 创建的大对象(对象内存大于设定阈值)直接进入老年代
- young gc后,To Survivor区不足以存放存活对象
- 每次young gc后,存活对象年龄+1。经过多次young gc后,如果存活对象的年龄达到了设定阈值(默认15),则会晋升到老年代中。
-
动态年龄判定规则。To Survivor区中年龄从小到大的对象占据空间的累加之和,占到了 To Survivor区一半以上的空间,那么大于等于此年龄的对象会直接进入老年代,而不需要达到默认的晋升年龄。
更多推荐
JVM young gc和full gc触发条件
发布评论