深入理解Java中的Minor GC、Major GC和Full GC

Minor GCMajor GCFull GC 并不是具体的垃圾回收器(如 G1、CMS、Serial 等),而是描述垃圾回收作用范围或阶段的术语。它们的核心区别在于回收的内存区域和触发条件

深入理解Java中的Minor GC、Major GC和Full GC

在Java的世界里,垃圾回收机制是保证程序稳定运行、高效利用内存的关键所在。而其中,Minor GC、Major GC和Full GC是垃圾回收过程中非常重要的概念。今天,就让我们深入剖析一下它们的原理、触发条件和特点。

一、Minor GC:年轻代的清理工

作用范围

Minor GC主要负责回收年轻代(Young Generation)的内存空间。年轻代又细分为Eden区和Survivor区(一般有两个Survivor区,分别称为Survivor 0和Survivor 1 )。新创建的对象通常会首先分配在Eden区。

触发条件

当Eden区的空间被耗尽,无法再为新对象分配内存时,Minor GC就会被触发。例如,在一个高并发创建对象的场景中,大量新对象快速涌入Eden区,一旦其容量达到上限,Minor GC便会启动。

特点

  1. 速度较快:年轻代中的对象生命周期通常较短,很多对象"朝生夕死",这使得Minor GC的回收效率相对较高。因为大部分对象都可以被直接回收,不需要进行复杂的处理。
  2. 复制算法的应用:在Minor GC过程中,存活的对象会被复制到Survivor区(如果Survivor区空间足够)。当对象在Survivor区熬过一定次数的GC后(这个次数可以通过参数设置,默认是15次),就会晋升到老年代。
  3. 广泛执行:几乎所有的Java垃圾回收器,如G1、CMS、Parallel等,在面对年轻代内存不足时,都会执行Minor GC。

二、Major GC:老年代的守护者

作用范围

Major GC主要针对老年代(Old Generation)进行内存回收。老年代存放的是那些在年轻代中经过多次GC后依然存活下来的对象,或者是一些大对象(大对象会直接在老年代分配内存,前提是老年代有足够空间)。

触发条件

当老年代的空间不足时,就会触发Major GC。比如,在应用程序运行过程中,由于对象晋升到老年代的速度过快,或者有大量大对象直接分配到老年代,导致老年代空间被占满,此时Major GC就会启动。

特点

  1. 速度相对较慢:与年轻代不同,老年代中的对象存活率较高,这意味着在回收过程中,需要处理的存活对象更多,所以Major GC的速度通常比Minor GC要慢。
  2. 不同回收器的不同策略
    • CMS(Concurrent Mark Sweep):采用并发标记清除算法,在回收过程中尽量减少对应用程序的停顿时间。但这种算法不会对内存进行整理,可能会导致内存碎片的产生。
    • G1(Garbage - First):通过混合回收(Mixed GC)的方式处理老年代Region,它会选择一部分年轻代Region和一部分老年代Region一起进行回收,以提高回收效率。
    • Serial/Old:使用单线程的标记 - 整理算法,这种方式在回收过程中会产生较长的STW(Stop The World,即暂停应用程序线程)时间。

需要注意的是,在不同的资料中,Major GC这个术语存在一定的歧义,有些地方会将Major GC等同于Full GC,所以在理解和使用时需要结合具体上下文。

三、Full GC:全面的大扫除

作用范围

Full GC是对整个Java堆(包括年轻代和老年代)以及元空间(Metaspace,也就是方法区)进行全面的内存回收。

触发条件

  1. 老年代空间不足且无法解决:当Major GC无法解决老年代的空间不足问题时,就会触发Full GC。例如,在老年代内存碎片化严重,且剩余空间无法容纳新晋升的对象时。
  2. 元空间不足:元空间主要存放类的元数据信息等。当加载的类过多,导致元空间被耗尽时,会触发Full GC。
  3. 显式调用System.gc():虽然Java提供了显式调用垃圾回收的方法System.gc(),但并不推荐在代码中随意使用,因为这可能会对应用程序的性能产生不可预测的影响。而且可以通过设置参数 -XX:+DisableExplicitGC来禁用这种显式调用。
  4. 内存分配策略失败:比如在对象晋升过程中,出现晋升担保失败的情况,即Survivor区无法容纳从Eden区复制过来的存活对象,此时也会触发Full GC。

特点

  1. STW停顿时间长:由于Full GC要回收整个堆和元空间的内存,涉及的对象和数据量庞大,所以会产生较长的STW停顿时间。这会严重影响应用程序的性能,导致应用程序在这段时间内几乎处于停滞状态。
  2. 尽量避免:所有的垃圾回收器都会尽量避免Full GC的发生。例如,G1垃圾回收器通过采用混合回收策略,尽可能在老年代空间占用达到一定比例时就进行回收,从而降低Full GC发生的概率。
  3. 回收算法:在Serial、Parallel等垃圾回收器中,Full GC通常采用单线程或并行的标记 - 整理算法;而G1垃圾回收器在Full GC时,会退化为单线程的Serial Old算法。

四、总结

Minor GC、Major GC和Full GC在Java垃圾回收机制中扮演着不同的角色,它们各自有着明确的作用范围、触发条件和特点。理解它们之间的区别和联系,对于优化Java应用程序的内存管理、提高应用程序的性能至关重要。在实际开发中,我们可以根据应用程序的特点和需求,合理选择垃圾回收器,并通过调整相关参数,来尽量减少Full GC的发生,降低垃圾回收对应用程序性能的影响。

希望通过这篇博客,大家能对Java中的这三种GC有更深入的理解,在处理Java内存相关问题时能够更加得心应手。

相关推荐
caihuayuan542 分钟前
生产模式下react项目报错minified react error #130的问题
java·大数据·spring boot·后端·课程设计
编程、小哥哥1 小时前
Java大厂面试:从Web框架到微服务技术的场景化提问与解析
java·spring boot·微服务·面试·技术栈·数据库设计·分布式系统
界面开发小八哥1 小时前
「Java EE开发指南」如何使用MyEclipse的可视化JSF编辑器设计JSP?(二)
java·ide·人工智能·java-ee·myeclipse
找不到、了2 小时前
Spring-Beans的生命周期的介绍
java·开发语言·spring
caihuayuan43 小时前
React Native 0.68 安装react-native-picker报错:找不到compile
java·大数据·sql·spring·课程设计
爱编程的鱼3 小时前
C#接口(Interface)全方位讲解:定义、特性、应用与实践
java·前端·c#
阿文_ing3 小时前
JVM 调优实战入门:从 GC 日志分析到参数调优
jvm
苹果酱05673 小时前
React方向:react脚手架的使用
java·vue.js·spring boot·mysql·课程设计
找不到、了3 小时前
JVM如何处理多线程内存抢占问题
java·jvm