关于Full Gc的疑问
作者,您好,我看你在介绍垃圾回收的算法的时候,似乎没有对Full Gc进行详细的介绍(虽然在P77面有介绍),我对Full GC 与Minor GC 和 Major GC之间的关系有一些疑问? 是不是这三者满足这样的关系: Full GC = Minor GC + Major GC ? 如果不是的话,你能解释一下它们之间的关系吗?
Full GC就是面向全堆的GC,在论文或者专业GC的书籍中是“Full Heap Garbage Collection"的缩写,可见就是针对“Full Heap”的。在Major GC被部分资料混淆为“只针对老年代的GC”以前,它跟术语“Major Garbage Collection”是等价的。
Full GC = Minor GC + Major GC
以上提法并不准确。
- 从因果关系看,在没有分代收集之前的GC就是FullGC,有分代之后才出现的Minor GC等概念。所以用等号右边来解释等号左边不符合因果率。
- 从实现角度看,单独实现FullGC无疑会比通过不同收集器针对不同区域分别收集要简单得多,假如只考虑FullGC的话,像记忆集这些结构都没什么存在的必要。所以从等号右边所做的工作比等号左边要更多。
要硬说它们的关系,就是同为垃圾收集,目标范围不同,有的针对全堆,有的针对新生代。用集合或者包含来理解并不恰当,即Appel经典分代中“Full Heap=Young Gen + Old Gen”,并不能推导出“Full GC = Young GC + Old GC ”。
此类问题我印象中在知乎、stackoverflow上面都很常见,按照置顶帖的建议,你可以先搜索一下,或者在那些网站上提问,可以更好地利用资源。
Full GC = Minor GC + Major GC是不能这样比较的,可以垃圾回收的作用域去询问,比如full gc的作用域是整个堆和方法区。