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

网友投稿 495 2022-10-28

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

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

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

Minor GC

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

当 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。

许多 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 的结合。

当准备要触发一次 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 的时间是一个非常重要的指标。

参考资料

​​Minor GC、Major GC和Full GC之间的区别 - ImportNew​​​​Major GC和Full GC的区别是什么?触发条件呢? - 知乎​​

JVM系列目录

JVM基础系列开篇:为什么要学虚拟机?JVM基础系列第1讲:Java 语言的前世今生JVM基础系列第2讲:Java 虚拟机的历史JVM基础系列第3讲:到底什么是虚拟机?JVM基础系列第4讲:从源代码到机器码,发生了什么?JVM基础系列第5讲:字节码文件结构JVM基础系列第6讲:Java虚拟机内存结构JVM基础系列第7讲:JVM类加载机制JVM基础系列第8讲:JVM 垃圾回收机制JVM基础系列第9讲:JVM垃圾回收器JVM基础系列第10讲:垃圾回收的几种类型JVM基础系列第11讲:JVM参数之堆栈空间配置JVM基础系列第12讲:JVM参数之查看JVM参数JVM基础系列第13讲:JVM参数之追踪类信息JVM基础系列第14讲:JVM参数之GC日志配置JVM基础系列第15讲:JDK性能监控命令

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:JVM基础教程第9讲:JVM垃圾回收器
下一篇:Backdoor-apk可以看成是一个shell脚本程序,它简化了在Android APK文件中添加后门的过程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~