在初学垃圾回收时,因为概念很多,对于GC这块都会有点混乱,尤其学习时搜集过各种资料的,我就是其中之一。今天学习了这块内容,对这块进行整理总结一下。
本文所说的均是对于HorSpot VM的实现。
GC的种类
分析
按照GC进行的区域,主要可以分为两大块:Partial GC和Full GC
- Partial GC:并不对整个堆进行收集的GC
- Full GC:对整个堆进行收集的GC
一般来说,Partial GC主要就是Young GC,即对新生代Young Gen进行垃圾回收。但是后面发展了很多的垃圾回收器,也出现了很多特别的Partial GC,比如CMS收集器的concurrent Collection模式就是只收集老年代的Old GC,G1收集器中有个模式,可以收集整个新生代Young Gen和部分老年代Old Gen。所以Partial GC又可以分为:
- Partial GC
- Young GC:只收集新生代
- Old GC:只收集老年代(CMS的concurrent Collection模式)
- Mixed GC:收集整个新生代和部分老年代(G1的一种模式)
学习过垃圾回收机制的应该听过两个说法:Minor GC和Major GC
- Minor GC:其实就是Young GC
- Major GC:一般都是指Full GC,但是随着技术发展,对这个词已经有点混乱了,有时也把这个指Old GC。(所以当听到这个词时要问清楚他具体说的是哪个?)
总结
部分收集 (Partial GC):
- 新生代收集(Minor GC / Young GC):只对新生代进行垃圾收集;
- 老年代收集(Old GC / Major GC):只对老年代进行垃圾收集。需要注意的是 Major GC 在有的语境中也用于指代整堆收集;
- 混合收集(Mixed GC):对整个新生代和部分老年代进行垃圾收集。
整堆收集 (Full GC / Major GC):收集整个 Java 堆和方法区。
Full GC的一些说明
问题
从上面的分类中可以知道,Full GC是整堆收集,也就是说包括了新生代Young Gen,但有些资料里面说当老年代空间不足时,先进行一个Minor GC,再Full GC。既然Full GC已经包括了新生代,为什么还有这种机制呢?
说明
其实一般情况下Full GC前是不用进行Minor GC的。但凡是总有例外。
比如Parallel Scavenge垃圾收集器下,在Full GC前就会进行一次Minor GC。其目的是减少Full GC的执行时间,减少单次的Full GC的STW(stop the world),并且在Minor GC和Full GC之间允许运行一下应用程序。
我们知道,Minor GC和Full GC都会有STW。将一次Full GC拆成两次,可以减少单次的STW,以尽量提升应用程序的响应速度。