JVM GC分类问题

求大佬解答一下这两个回复哪个是正确的,非常感谢

分类要看分类的维度是什么,例如不同的垃圾回收器类型有下面几种,然后每种内部又有不同的阶段。

  1. Serial Garbage Collector
  2. Parallel Garbage Collector
  3. CMS Garbage Collector
  4. G1 Garbage Collector

参考:

  1. https://javapapers.com/java/types-of-java-garbage-collectors/
  2. https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

我压字多的

从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC

Major GC 是清理永久代。

Full GC 是清理整个堆空间—包括年轻代和永久代。

 根据对象的存活时长,把java堆划分为新生代(Young Generation)和老年代(Old Generation)区域,新生代中每次gc都有大量对象死去,少量存活的对象会移动到老年代区域中去。对不同的领域进行回收,主要分为:部分收集整堆收集

  • 部分收集(Partial GC):对java堆中的部分进行GC。

    • 新生代收集(Minor GC/Young GC):只收集新生代的垃圾。

    • 老年代收集(Major GC/Old GC):只收集老年代的垃圾。目前只有CMS会单独收集老年代。

    • 混合收集(Mixed GC):收集整个新生代和部分老年代的垃圾。目前只有G1收集器具有该行为。

  • 整堆收集(Full GC):对整个java堆和方法区进行GC。

 

他们两的回答都不准确Full GC和Partial GC是一个级别的,Major G、Minor GC和Mixed GC是一个级别的,都属于Partial G。相信我,我刚看的《深入理解java虚拟机》。

minor GC:指发生在新生代的垃圾回收行为

major GC:指发生在老年代中的行为

full GC:指对整个堆与方法区进行垃圾收集的行为。

但是来了,也有非主流划分,major GC 与 full GC都指回收整堆的,为什么会这么划分呢?

因为服务端最常用的老年代(major GC)收集器CMS,在jdk9之后已经没有了与之配对的新生代垃圾收集器(默认指定ParNew为CMS的新生代解决方案),这时候作为major GC的CMS,其实就是指的整个堆回收。

总结:可以把major GC认为成整堆回收,也可以认为是只针对老年代的垃圾收集,但认为是Full GC 肯定是不对的,因为Full GC要包含方法区的回收,所以两个人都不是太对,也错的不多。

如果觉得我说的不好,建议去看下《深入理解java虚拟机第3版》的第三章。