Minor GC 和 Full GC 的触发条件

如题,不过首先需要对 GC 做一个统一的定义,这里引用 《深入理解 Java 虚拟机》中的介绍:

  • 部分收集(Partial GC):指目标不是完整收集整个 Java 堆的垃圾收集,其中又分为:
    • 新生代收集(Minor GC/Young GC):指目标知识新生代的垃圾收集。
    • 老年代收集(Major GC/Old GC):指目标只是老年代的垃圾收集器。目前只有 CMS 收集器会有单独收集老年代的行为。另外请注意“Major GC”这个说法现在有点混淆,在不同资料上常有不同所指,需按上下文区别分别到底是指老年代的收集还是整堆的收集。
    • 混合收集(Mixed GC):指目标是收集整个新生代以及部分老年代的垃圾收集。目前只有 G1 收集器会有这种行为。
  • 整堆收集(Full GC):收集整个 Java 堆和方法区的垃圾收集。

最简单的分代 GC 策略,按 Hotspot VM 的 serial GC 的实现来看,触发条件是:

Minor GC 触发条件

  • 当 young gen 中的 Eden 区分配满的时候触发。注意 young GC 中有部分存活对象会晋升到 old gen,所以 Minor GC 后 old gen 的占用通常会有所升高;

Full GC 触发条件

  • 通过 Minor GC 后进入老年代的平均大小大于老年代的可用内存

    当准备要触发一次 Minor GC 时,如果发现之前统计的 Minor GC 的平均晋升到 old gen 的大小比目前 old gen 剩余的空间还大,则不会触发 Minor GC 而是转为触发 Full GC。(注意:因为HotSpot VM 的 GC 里,除了 CMS 的 concurrent collection 之外,其他能收集 old gen 的 GC 都会同时收集整个 GC 堆,包括 young gen,所以不需要事先触发一次单独的 young GC)

  • 显式调用 System.gc( ) 方法

    此方法的调用是建议 JVM 进行 Full GC,该方法调用后并不一定会立即执行,但会增加系统 Full GC 的频率,那么也就意味着增加了间歇性停顿的次数。所以此方法并不建议使用,让虚拟机自己去管理它的内存,可通过通过 -XX:+ DisableExplicitGC 来禁止 RMI(Java远程方法调用)调用 System.gc。

  • 老年代空间不足

    old gen 空间只有新生代对象转入及创建大对象或者大数组时会出现不足的现象,当执行Full GC后空间仍然不足,则抛出如下错误: java.lang.OutOfMemoryError: Java heap space

    为避免以上两种状况引起的 FullGC,调优时应尽量做到让对象在 Minor GC 阶段被回收、让对象在新生代多存活一段时间及不要创建过大的对象及数组。

  • 方法区空间不足

    JVM规范中运行时数据区域中的方法区,在 HotSpot 虚拟机中又被习惯称为永久代,Permanet Generation 中存放的为一些 class 的信息、常量、静态变量等数据,当系统中要加载的类、反射的类和调用的方法较多时,Permanet Generation 可能会被占满,在未配置为采用CMS GC的情况下也会执行Full GC。如果经过Full GC仍然回收不了,那么 JVM 会抛出如下错误信息:
    java.lang.OutOfMemoryError: PermGen space
    为避免Perm Gen占满造成Full GC现象,可采用的方法为增大Perm Gen空间或转为使用CMS GC。

  • 获取 heap dump 触发

    执行获取内存 dump,jmap -histo:live pid,这种方式会触发 Full GC,所以如果不想触发 Full GC,可以使用 jmap -histo pid。

HotSpot VM里其它非并发GC的触发条件复杂一些,不过大致的原理与上面说的其实一样。
当然也总有例外。Parallel Scavenge(-XX:+UseParallelGC)框架下,默认是在要触发full GC前先执行一次young GC,并且两次GC之间能让应用程序稍微运行一小下,以期降低 Full GC 的暂停时间(因为young GC会尽量清理了young gen的死对象,减少了full GC的工作量)。控制这个行为的VM参数是 -XX:+ScavengeBeforeFullGC

参考资料:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值