[软技能] 第1416天 请说说你对Major GC和Minor GC的理解

132 阅读2分钟

Major GC和Minor GC是垃圾回收(Garbage Collection)中的两个概念。

Minor GC

通常也称为新生代GC,它只会对新生代(Young Generation)中的对象进行垃圾回收。新生代是Java Heap中划分的一块内存区域,用于存放新创建的对象,其中又分为Eden Space、Survivor Space From、Survivor Space To三个区域。

Minor GC的工作流程如下:

  • 当Eden区满时,触发Minor GC。
  • 将Eden区中的存活对象复制到Survivor区From。
  • 如果Survivor区From已经满了,则将其中的存活对象复制到Survivor区To,不存活的对象直接清理掉。
  • 经过多次GC仍然存活的对象,会被放到年老代(Old Generation)中。

Major GC

通常也称为Full GC,它会对整个Java Heap进行垃圾回收,包括年轻代和年老代。

Major GC的工作流程如下:

  • 当年老代(Old Generation)的空间不足时,触发Major GC。
  • Major GC会对整个Java Heap进行垃圾回收,包括年轻代和年老代。
  • 对于Survivor区域中的存活对象,也会放到年老代中。

因为Major GC的开销较大,所以应该尽量减少Major GC的触发次数。一般的优化策略是增加年轻代的大小,尽量使对象在年轻代中被回收。

提示

目前,这些术语无论是在 JVM 规范还是在垃圾收集研究论文中都没有正式的定义。但是我们一看就知道这些在我们已经知道的基础之上做出的定义是正确的,Minor GC 清理年轻代内存应该被设计得简单:

  • Major GC 是清理老年代
  • Full GC 是清理整个堆空间—包括年轻代和老年代。

很不幸,实际上它还有点复杂且令人困惑。首先,许多 Major GC 是由 Minor GC 触发的,所以很多情况下将这两种 GC 分离是不太可能的。另一方面,许多现代垃圾收集机制会清理部分永久代空间,所以使用“cleaning”一词只是部分正确。这使得我们不用去关心到底是叫 Major GC 还是 Full GC,大家应该关注当前的 GC 是否停止了所有应用程序的线程,还是能够并发的处理而不用停掉应用程序的线程。

扩展阅读

V8中的垃圾回收

更多题目

github.com/haizlin/fe-…