1.JVM FullGC 触发条件汇总

一共5种场景

1.System.gc()
程序中显式的调用System.gc(),有可能会触发Full GC。(比如NIO中的直接内存使用)使用-XX:-+DisableExplicitGC 参数,可以禁用。

2.老年代空间不足
这个空间不足有两种,一种是分配一个对象,空间真的不足。另一种是由于内存碎片,导致没有连续内存空间来分配给对象。

3.CMS GC时出现空间分配担保失败和concurrent mode failure
promotion failed 空间分配担保失败 ,Minor GC之前,会比较“老年代剩余空间”与“新生代所有对象之和”的大小,如果老年代剩余空间大于新生代之和,则本次Minor GC一定是安全的,反之,去看参数是否允许担保失败,不允许,则会触发一次Full GC
concurrent mode failure CMS无法处理浮动垃圾,因为CMS运行和程序运行是并行的,标记之后产生的垃圾cms处理不了,此时程序如果申请一块儿空间,内存不够,就会发生concurrent mode failure 。此时虚拟机会启用serial old收集器来进行老年代的回收,停顿时间会很长。

4.之前历次minorGC晋升到老年代的对象平均大小如果大于此时老年代的剩余空间,也会导致一次Full GC。

5.metaspace空间不足也会造成Full GC。

6.当YGC时会做出检查是否进行Full GC:
采用Parallel GC的情况下,当YGC触发时,会有两个检查:
1、在YGC执行前,min(目前新生代已使用的大小,之前平均晋升到old的大小中的较小值) > 旧生代剩余空间大小 ? 不执行YGC,直接执行Full GC : 执行YGC;
2、在YGC执行后,平均晋升到old的大小 > 旧生代剩余空间大小 ? 触发Full GC : 什么都不做。

在写代码的时候,先尝试了直接new一个大对象,但直接这么做会在Full GC之前触发一次Young GC,测试下来加了 -XX:-ScavengeBeforeFullGC 也还是会先Young GC (Full GC (Allocation Failure)之前)。

搞了个课程看看,收获不小,可以少走点弯路吧.
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值