我们经常会听到许多垃圾回收的术语,例如: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 将存活较久的对象移动到老年代中,从而腾出更多的年轻代空间。

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的区别是什么?触发条件呢? - 知乎

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


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性能监控命令

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

  1. JVM基础系列第7讲:JVM 类加载机制

    当 Java 虚拟机将 Java 源码编译为字节码之后,虚拟机便可以将字节码读取进内存,从而进行解析.运行等整个过程,这个过程我们叫:Java 虚拟机的类加载机制.JVM 虚拟机执行 class 字节 ...

  2. JVM基础系列第14讲:JVM参数之GC日志配置

    说到 Java 虚拟机,不得不提的就是 Java 虚拟机的 GC(Garbage Collection)日志.而对于 GC 日志,我们不仅要学会看懂,而且要学会如何设置对应的 GC 日志参数.今天就让 ...

  3. java虚拟机学习-JVM调优总结-新一代的垃圾回收算法(11)

    java虚拟机学习-深入理解JVM(1) java虚拟机学习-慢慢琢磨JVM(2) java虚拟机学习-慢慢琢磨JVM(2-1)ClassLoader的工作机制 java虚拟机学习-JVM内存管理:深 ...

  4. JVM内存模型、原理、垃圾回收、调优

    JVM内存模型.原理.垃圾回收.调优,这Java语言的基础,作为Java从业人员是必须要掌握的,另外这也是面试经常会问到的知识. ----------------------------------- ...

  5. 5、JVM分代模型--新生代 的垃圾回收

    为什么要有JVM分代模型? JVM中的对象生命周期不同,有的对象长期存在,而有的对象朝生夕死,对象生命周期的不同直接导致了进行垃圾回收时存活对象比例不同,而存活对象比例不同就导致需要使用不同的垃圾回收 ...

  6. JVM上篇学习4--内存与垃圾回收

    JVM上篇学习4–内存与垃圾回收(垃圾回收相关算法.垃圾回收相关概念.垃圾回收器) 目录 JVM上篇学习4--内存与垃圾回收(垃圾回收相关算法.垃圾回收相关概念.垃圾回收器) 15. 垃圾回收相关算法 ...

  7. STM32 基础系列教程 10 - 单线串口(半双工)

    前言 在工程应用中,很多时间为了方便走线会采用单线串口方案,本节将学习stm32 usart单线串口的使用,学会用使用单线串口收发数据. 示例详解 基于硬件平台: STM32F10C8T6最小系统板, ...

  8. JVM(2)--一文读懂垃圾回收

    与其他语言相比,例如c/c++,我们都知道,java虚拟机对于程序中产生的垃圾,虚拟机是会自动帮我们进行清除管理的,而像c/c++这些语言平台则需要程序员自己手动对内存进行释放. 虽然这种自动帮我们回 ...

  9. java对象什么时候回收_Java对象的生命周期与垃圾回收以及四种引用

    创建对象的方式用new语句创建对象. 使用反射,调用java.lang.Class或java.lang.reflect.Constructor的newInstance()实例方法. 调用对象的clon ...

最新文章

  1. OC 消息转发实现多继承
  2. PHP框架中的日志系统
  3. EIGRP-2(EIGRP的路由认证)
  4. JCO3远程调用SAP接口随笔一(配置连接池)
  5. php改变iframe的src,js动态改变iframe的src属性
  6. acer清理工具 clear下载_免流量工具聚合下载,包含全部工具
  7. 关于FragmentManager动态管理Fragment时Fragment生命周期的探究
  8. 一文足以了解什么是 Java 中的锁
  9. 工作的时候用到spring返回xml view查到此文章亲测可用
  10. 模拟image的ajaxPrefilter与ajaxTransport处理
  11. pytorch 学习1
  12. html5 jquery音乐播放器,play()和pause()不起作用
  13. Hyperworks——Optistruct学习分享
  14. 中国能源统计年鉴资源网站
  15. Linux服务器之Redis集群搭建
  16. 前端从一只小白到工作半年的心路历程
  17. 面试.net资深程序员的前5分钟
  18. 如何区别计算机体系结构与计算机组成这两个概念?
  19. 关于vue项目的seo问题
  20. 【C++/嵌入式笔试面试八股】大纲介绍

热门文章

  1. Python HTMLCalendar类| 带实例的formatyear()方法
  2. Java——List集合特有的功能
  3. php的list函数
  4. php数组的下标、extract函数
  5. Codeforces Round #381 (Div. 2) Codeforce_740
  6. 忘记手势密码的解决办法
  7. 记录一下自己的VScode插件
  8. vfprintf()函数
  9. CSS清除默认样式,看完这篇彻底明白了
  10. 我想谈谈关于Android面试那些事,一篇文章帮你解答