Minor GC 与 Full GC
Minor GC:新生代 GC,指产生在新生代的垃圾收集动作,因为 Java 对象大多都具备朝生夕灭的个性,所以 Minor GC 十分频繁,个别回收速度也比拟快。
Full GC:老年代 GC,或者 Major GC。指产生在老年代的 GC,呈现了 Major GC,常常会随同至多一次的 Minor GC(并非相对,比方在 Parallel Scavenge 收集器的收集策略里就有间接进行 Major GC 的策略抉择过程),Major GC 的速度个别会比 Minor GC 慢 10 倍以上。
调配策略
- 对象优先在 Eden 调配
大多数状况下,对象在新生代 Eden 区调配。当 Eden 区没有足够的空间进行调配时,虚拟机将发动一次 Minor GC。 - 大对象间接进入老年代
大对象是指须要大量间断内存空间的 Java 对象,最典型的就是那种很长的字符串以及数组。 - 长期存活的对象将进入老年代
虚拟机采纳了分代收集的思维来治理内存,在内存回收时必须可能辨认哪些对象应该放在新生代,哪些对象应该放在老年代。因而,虚拟机给每个对象定义了一个对象年龄计数器。如果对象在 Eden 出世并且通过第一次 Minor GC 后依然存活,并且能被 Survivor 包容的话,将被挪动 Survivor 空间中,并且对象年龄设为 1. 对象在 Survior 区中每“熬过”一次 Minor GC,年龄就减少 1 岁,当对象的年龄减少到肯定水平(默认 15 岁),就会被降职到老年代中。对象今生老年代的阈值,能够通过参数 -XX:MaxTenutingThreshold 进行设置。 - 动静对象年龄判断
为了能更好地适应不同应用程序的内存情况,虚拟机并不是永远地要求对象的年龄必须达到 MaxTenutingThreshold 能力降职到老年代,如果 Survivor 空间中雷同年龄的所有对象大小的总和大于 Survivor 空间的一半,年龄大于或等于该年龄的对象就能够间接进入老年代。 - 空间调配担保
在产生 Minor GC 之前,虚构机会先查看老年代最大可用的间断空间是否大于新生代所有对象总空间,如果这个条件成立,那么 Minor GC 能够确保是平安的。如果这个条件不成立,则虚构机会查看 HandlePromotionFailure 设置值是否容许担保失败。如果容许,就会持续查看老年代最大可用间断空间是否大于历次降职到老年代对象的均匀大小,如果大于,将尝试进行一次 Minor GC;如果小于,或者 HandlePromotionFailure 设置不容许冒险,这个时候也要进行一次 Full GC。