Java垃圾回收名词

我们在学习JVM的GC相关知识时,必定会接触到几个GC的专有名词:Minor GC、Major GC、Young GC、Old GC、Full GC、Stop The World(STW),现在我们来了解一下这些名词具体指的是什么。

Minor GC && Young GC

Minor GC和Young GC都是指新生代的内存回收,两个名词指的是同一件事情,我们都知道现在的商业化虚拟机中,新生代被分为Eden和Survivor区,关于Minor GC我们需要知道以下几点:

  1. 当Eden区无法为新创建的对象分配空间时,会触发Minor GC。Eden区空间越小,Minor GC的频率越高
  2. 当Eden区空间不足触发Minor GC时,新生代中会有部分对象晋升到老年代,所以Minor GC之后,老年代的空间使用量通常会有所升高
  3. 新生代的大部分垃圾收集器都会触发STW,但是新生代的大部分对象通常情况下都是朝生夕死的,所以Eden区的大部分对象都可以认为是垃圾对象,只有很少的一部分对象会被复制到Survivor区和老年代,这种情况下STW的时间会很短;而当Minor GC之后Eden区仍存活非常多的对象,那么垃圾收集器就会将这些对象复制到Survivor区或老年代,此时STW的时间就会变的很长,因为复制大量对象相比复制少量对象更耗时。

Major GC && Old GC

这两个名词都指的是老年代空间回收,也属于是同一件事。很多情况下,Major GC是由Minor GC触发的,比如当发生Minor GC时,会将新生代的部分满足条件的对象晋升到老年代,如果此时老年代的可用空间不足,那么就会触发Major GC,因此说在大部分情况下Major GC都是由Minor GC触发的。

Full GC

Full GC是比较特殊的一种,它等于是Minor GC和Major GC的结合,主要用于回收新生代、老年代和永久代。

  1. 当老年代空间不足时,会触发Full GC
  2. 在代码中显式调用System.gc()时,JVM会建议执行Full GC
  3. 方法区空间不足时,会触发Full GC,但是在jdk1.8之后采用Metaspace来代替方法区,所以在此之后一般不会因为方法区空间不足而触发Full GC
  4. 通过Minor GC之后存活的对象大于之前每次晋升时老年代的平均可用空间时,会自动触发Full GC

Stop-The-World(STW)

STW意为停止全世界,对于JVM来说,它的世界里存活的都是一个个线程,所以意思也就是在进行GC时,会将虚拟机中其他的工作线程全部暂停,当GC结束之后,再继续恢复工作。

所以对于一个垃圾收集器来说,STW的时间是一个非常重要的性能指标,并且STW直接影响的是虚拟机的吞吐量(吞吐量 = 虚拟机运行时间 / (STW时间 + 虚拟机运行时间)),也就是STW时间越短,虚拟机吞吐量越高,执行效率越高。