JVM基础系列第10讲:垃圾回收的几种类型

咱们常常会听到许多垃圾回收的术语,例如:Minor GC、Major GC、Young GC、Old GC、Full GC、Stop-The-World 等。但这些 GC 术语到底指的是什么,它们之间的区别究竟是什么?今天咱们就来详细说说。html

Minor GC

从年轻代空间回收内存被称为 Minor GC,有时候也称之为 Young GC。对于 Minor GC,你须要知道的一些点:java

  • 当 JVM 没法为一个新的对象分配空间时会触发 Minor GC,好比当 Eden 区满了。因此 Eden 区越小,越频繁执行 Minor GC。
  • 当年轻代中的 Eden 区分配满的时候,年轻代中的部分对象会晋升到老年代,因此 Minor GC 后老年代的占用量一般会有所升高。
  • 质疑常规的认知,全部的 Minor GC 都会触发 Stop-The-World,中止应用程序的线程。对于大部分应用程序,停顿致使的延迟都是能够忽略不计的,由于大部分 Eden 区中的对象都能被认为是垃圾,永远也不会被复制到 Survivor 区或者老年代空间。若是状况相反,即 Eden 区大部分新生对象不符合 GC 条件(即他们不被垃圾回收器收集),那么 Minor GC 执行时暂停的时间将会长不少(由于他们要JVM要将他们复制到 Survivor 区或老年代)。

Major GC

从老年代空间回收内存被称为 Major GC,有时候也称之为 Old GC。jvm

许多 Major GC 是由 Minor GC 触发的,因此不少状况下将这两种 GC 分离是不太可能的。性能

Minor GC 做用于年轻代,Major GC 做用于老年代。 分配对象内存时发现内存不够,触发 Minor GC。Minor GC 会将对象移到老年代中,若是此时老年代空间不够,那么触发 Major GC。所以才会说,许多 Major GC 是由 Minor GC 引发的。学习

Full GC

Full GC 是清理整个堆空间 —— 包括年轻代、老年代和永久代(若是有的话)。所以 Full GC 能够说是 Minor GC 和 Major GC 的结合。spa

当准备要触发一次 Minor GC 时,若是发现年轻代的剩余空间比以往晋升的空间小,则不会触发 Minor GC 而是转为触发 Full GC。由于JVM此时认为:以前这么大空间的时候已经发生对象晋升了,那如今剩余空间更小了,那么很大几率上也会发生对象晋升。既然如此,那么我就直接帮你把事情给作了吧,直接来一次 Full GC,整理一下老年代和年轻代的空间。线程

另外,即在永久代分配空间但已经没有足够空间时,也会触发 Full GC。翻译

Stop-The-World

Stop-The-World,中文通常翻译为全世界暂停,是指在进行垃圾回收时由于标记或清理的须要,必须让全部执行任务的线程中止执行任务,从而让垃圾回收线程回收垃圾的时间间隔。日志

在 Stop-The-World 这段时间里,全部非垃圾回收线程都没法工做,都暂停下来。只有等到垃圾回收线程工做完成才能够继续工做。能够看出,Stop-The-World 时间的长短将关系到应用程序的响应时间,所以在 GC 过程当中,Stop-The-World 的时间是一个很是重要的指标。code

参考资料


若是只是看,其实没法真正学会知识的。为了帮助你们更好地学习,我建了一个虚拟机群,专门讨论学习 Java 虚拟机方面的内容,每周针对我所发文章进行讨论答疑。若是你有兴趣,关注「Java技术精选」公众号,经过右下角菜单「入群交流」加我好友,小助手会拉你入群。


JVM系列目录

相关文章
相关标签/搜索