当前位置: 首页 > news >正文

「JVM」Full GC和Minor GC、Major GC

Full GC和Minor GC、Major GC

  • 一、Full GC
    • 1、什么是Full GC?
    • 2、什么情况下会触发full gc?
  • 二、Minor GC
    • 1、什么是Minor GC?
    • 2、什么情况下会触发Minor GC?
  • 三、Major GC
    • 1、什么是Major GC?
    • 2、什么情况下会触发Major GC?
  • 四、Major GC和Full Gc的区别
  • 五、总结

一、Full GC

1、什么是Full GC?

Full GC(Full Garbage Collection)是Java虚拟机(JVM)中的一种垃圾回收操作。它是指对整个堆内存进行回收,包括新生代和老年代。

在Java中,垃圾回收器通常会将堆内存划分为不同的区域,如新生代和老年代。当新生代空间不足时,会触发Minor GC,只清理新生代内存。而当老年代空间不足或者为了整理碎片化的内存,会触发Full GC,对整个堆内存进行回收

Full GC 可能会导致较长的停顿时间,因为它需要扫描整个堆内存,标记可回收对象,并进行内存整理。这意味着在 Full GC 过程中,应用程序的执行会被暂停。

Full GC 的频率会受多种因素影响,如堆内存的大小、JVM配置参数、对象分配速度等。如果 Full GC 发生过于频繁或耗时过长,可能会导致应用程序的性能下降。

为了减少 Full GC 的频率和时间,可以采取以下策略:

  1. 调整堆内存大小:适当设置堆内存大小,避免过小或过大的情况。
  2. 优化对象分配:减少临时对象的创建和使用,避免过多的对象进入老年代。
  3. 设置合适的垃圾回收器:根据应用程序的需求和性能特点,选择合适的垃圾回收器和相应的配置参数。
  4. 进行代码优化:减少内存泄漏和不必要的对象引用,使垃圾回收更高效。

需要注意的是,Full GC 是一项比较重型的操作,在设计和调优应用程序时需要综合考虑内存分配、垃圾回收和应用程序的执行性能,以达到良好的性能和响应速度。

2、什么情况下会触发full gc?

Full GC(Full Garbage Collection)在Java虚拟机(JVM)中触发的情况主要有以下几种:

  1. Minor GC后老年代空间不足:Minor GC(新生代垃圾回收)时,如果存活的对象无法全部放入老年代,或者老年代空间不足以容纳存活的对象,则会触发Full
    GC,对整个堆内存进行回收。

  2. 显式调用System.gc():尽管调用System.gc()方法不能保证立即进行Full GC,但它可以向JVM建议执行垃圾回收操作,包括Full GC。不过,频繁调用System.gc()是不推荐的。

  3. 永久代空间不足(仅适用于JVM 8及之前版本):在传统的JVM版本中,永久代(Permanent Generation)用于存储类和方法相关信息。如果永久代空间不足,JVM会触发Full GC来清理永久代。

  4. CMS初始化标记阶段出现Promotion Failed:CMS回收器(Concurrent Mark Sweep)是一种用于减少停顿时间的垃圾回收器。在CMS的初始化标记(InitialMark)阶段,如果发现无法为所有存活对象标记,可能会触发Full GC。

需要注意的是,Full GC的触发由JVM自动管理的,并且具体的触发条件可能会因不同的JVM版本、垃圾回收器类型和配置参数而有所差异。以及,Full GC的触发可能导致较长的停顿时间,因为它需要扫描整个堆内存并进行标记、整理操作。在设计和调优应用程序时,应综合考虑内存分配、垃圾回收和应用程序的执行性能,以获得较好的性能和响应速度。

二、Minor GC

1、什么是Minor GC?

Minor GC(Young Generation Garbage Collection)是指对年轻代(Young Generation)进行的垃圾回收操作。在Java虚拟机中,堆内存被划分为不同的区域,其中年轻代是对象分配的主要区域。Minor GC主要负责回收年轻代的垃圾对象

年轻代通常分为三个区域:一个Eden区和两个Survivor区(一般称为From区和To区)。当对象被创建时,它们会被分配到Eden区。在年轻代的垃圾回收过程中,首先会对Eden区进行垃圾回收,将存活的对象复制到一个空闲的Survivor区中(通常是To区),同时清空Eden区。如果Survivor区无法容纳所有存活的对象,一部分对象会被直接晋升到老年代(Tenured Generation)。

在多次Minor GC后,存活时间较长的对象会逐渐被移到Survivor区,并经过多次复制和清理的过程。当对象经历了一定次数的复制后,会被认为是长时间存活的对象,最终会被晋升到老年代。

Minor GC通常是并行或并发执行的,意味着在垃圾回收期间,应用程序的执行可能会暂停或降低速度。为了减少这种停顿时间,一些垃圾回收器,如并行垃圾回收器(Parallel GC)和G1垃圾回收器(Garbage-First GC),采用了并发标记和清理的方式。

总之,Minor GC是一种针对年轻代进行的垃圾回收操作,主要目的是回收年轻代的垃圾对象,以保证堆内存的有效利用和应用程序的性能。

2、什么情况下会触发Minor GC?

Minor GC(Young Generation Garbage Collection)在Java虚拟机中会在以下情况下触发:

1.对象分配:当应用程序创建新对象时,首先将其分配到年轻代的Eden区。如果Eden区没有足够的空间来容纳新对象,则会触发Minor GC。

  1. 存活对象晋升:当年轻代经历了多次垃圾回收后,仍然存活的对象会被移到Survivor区。当Survivor区无法容纳所有存活的对象时,一部分对象将被晋升到老年代。在晋升对象时,也可能触发Minor
    GC。

  2. 动态年龄判定:在年轻代进行垃圾回收时,会根据对象的年龄来决定是否晋升到老年代。具体地,当某个对象经过一次Minor GC后仍然存活,并且达到一定的年龄阈值(通常是15岁),则会直接晋升到老年代。这个过程也会触发Minor GC。

需要注意的是,Minor GC的触发条件是由JVM自动管理的,具体条件可能因不同的JVM实现和垃圾回收器而有所不同。此外,Minor GC的目标是快速回收年轻代的垃圾对象,以减少老年代的压力和提高应用程序的性能。因此,Minor GC通常会频繁发生但每次垃圾回收的停顿时间较短。在应用程序设计和调优中,可以通过适当配置堆大小和调整垃圾回收相关的参数来平衡Minor GC的频率和停顿时间,以达到更好的性能表现。

三、Major GC

1、什么是Major GC?

Major GC(Major Garbage Collection)是指对Java虚拟机中的老年代(Tenured Generation)进行的垃圾回收操作。与Minor GC主要关注年轻代的回收不同,Major GC专注于回收老年代中的垃圾对象

在Java堆内存中,老年代用于存放生命周期较长的对象或者经过多次Minor GC后仍然存活的对象。随着时间的推移,老年代中的垃圾对象会逐渐增加,因此需要进行周期性的垃圾回收来释放这些占用的内存空间。

Major GC的触发条件通常是由JVM自动管理的,具体条件可能因不同的JVM实现和垃圾回收器而有所不同。它可能在以下情况下触发:

1. 老年代空间不足:当老年代无法容纳新对象或晋升对象时,会触发Major GC来回收老年代的垃圾对象。

  1. 永久代垃圾回收:如果使用的是传统的垃圾回收器(如Parallel GC、CMS等),那么Major GC也会包含对永久代(Permanent Generation)的垃圾回收操作,用于清理无效的类定义、常量等。

  2. JVM显式调用:通过System.gc()或Runtime.getRuntime().gc()等方式显式调用垃圾回收,可能会触发Major
    GC。

Major GC的执行时间一般比Minor GC更长,因为它需要处理较多的对象和进行更复杂的内存整理操作。在Major GC期间,应用程序的执行将会暂停,直到垃圾回收操作完成。了解Major GC对于应用程序的性能分析和调优非常重要,适当配置堆大小、调整垃圾回收器参数等可以减少Major GC的频率和停顿时间,以提高应用程序的吞吐量和响应性能。

2、什么情况下会触发Major GC?

Major GC(Major Garbage Collection)在Java虚拟机中会在以下情况下被触发

  1. 老年代空间不足:当老年代(Tenured Generation)无法容纳新对象或晋升对象时,会触发Major GC来回收老年代的垃圾对象。这种情况通常发生在频繁创建大对象或者持久对象导致老年代空间快要满了的情况下。

  2. 晋升(Promotion)失败:在年轻代(Young Generation)中的对象经过多次Minor GC后仍然存活并且达到了晋升的条件,但是老年代空间不足以容纳它们时,也会触发Major
    GC。这种情况可能是因为年轻代中的对象生命周期较长,导致垃圾对象聚集在老年代中。

  3. 空间分配担保失败:在进行Minor GC时,如果老年代的连续内存空间不足以容纳晋升对象,JVM会尝试进行一次Minor GC并且通过移动对象来释放更多的连续空间。如果这个过程之后仍然无法满足空间需求,那么会触发Major GC。

  4. 显式调用:通过System.gc()或Runtime.getRuntime().gc()等方式显式调用垃圾回收,也有可能触发Major GC。不过请注意,Java虚拟机对于显式调用垃圾回收的处理是可选的,因此并不保证一定会触发Major GC。

需要注意的是,具体的Major GC触发条件可能因不同的JVM实现和垃圾回收器而有所不同。此外,Major GC的具体行为和执行策略也会受到所使用的垃圾回收器的影响。因此,在实际应用中,可以通过调整堆大小、调整垃圾回收器参数等方式来影响Major GC的触发频率和行为,以优化应用程序的性能。

四、Major GC和Full Gc的区别

Major GC(Major Garbage Collection)和Full GC(Full Garbage Collection)是Java虚拟机中的垃圾回收操作,它们在执行对象和目的上存在一些区别。

  1. 执行对象

    • Major GC:主要对老年代(Tenured Generation)进行垃圾回收操作,清理长生命周期的对象或经过多次Minor GC后仍然存活的对象。
    • Full GC:涵盖了整个堆内存,包括年轻代和老年代,在进行垃圾回收时会同时处理这两个区域的对象。
  2. 目的

    • Major GC:专注于回收老年代中的垃圾对象,以释放老年代的内存空间。
    • Full GC:除了回收老年代中的垃圾对象外,还会执行其他与垃圾回收相关的任务,如处理永久代中的无效类及常量,并进行堆内存的整理和碎片整理等工作。
  3. 触发条件

    • Major GC:由JVM自动触发,通常在老年代空间不足、晋升对象或永久代垃圾回收等情况下触发。
    • Full GC:触发条件相对复杂,可能在年轻代无法容纳对象、永久代满了、显式调用System.gc()等情况下触发。
  4. 停顿时间

    • Major GC:执行时间相对较短,因为它只关注回收老年代的垃圾对象。
    • Full GC:执行时间较长,因为它需要同时回收整个堆内存,并执行一些更为耗时的操作,如处理永久代中的无效类、堆内存的整理等。Full
      GC期间,应用程序的执行将会暂停。

总结:Major GC和Full GC都是Java虚拟机中的垃圾回收操作,但Major GC主要关注老年代的回收,执行时间较短,而Full GC则涵盖整个堆内存,包括年轻代和老年代,执行时间较长且包含更多的垃圾回收相关任务。了解它们的区别和运行机制有助于进行性能调优和垃圾回收策略的合理配置。

五、总结

Full GC(Full Garbage Collection)和Minor GC(Young Generation Garbage Collection)都是Java虚拟机中的垃圾回收操作,但它们的执行对象和目的略有不同

Minor GC主要针对年轻代(Young Generation)进行垃圾回收,即对Eden区和Survivor区进行清理。它的目的是回收年轻代的垃圾对象,以保证堆内存的有效利用和应用程序的性能。Minor GC通常频繁发生,但每次垃圾回收的停顿时间较短

Full GC是对整个堆内存进行垃圾回收,包括年轻代和老年代(Tenured Generation)。Full GC的触发条件相对复杂,通常情况下会在以下几种情况下触发:当年轻代无法容纳对象永久代(Permanent Generation)了、在System.gc()被显式调用时等。Full GC的目的是回收整个堆内存中的垃圾对象,并进行一些更为耗时的操作,如处理永久代中的无效类、对堆内存进行碎片整理等。因此,Full GC通常会导致较长的停顿时间对应用程序的性能会产生比较大的影响

总结起来Minor GC主要负责回收年轻代的垃圾对象,频繁发生但停顿时间较短而Full GC负责回收整个堆内存的垃圾对象,触发条件复杂且停顿时间较长。了解并合理配置这两种垃圾回收操作对于应用程序的性能表现和系统资源利用非常重要。

相关文章:

「JVM」Full GC和Minor GC、Major GC

Full GC和Minor GC、Major GC 一、Full GC1、什么是Full GC?2、什么情况下会触发full gc? 二、Minor GC1、什么是Minor GC?2、什么情况下会触发Minor GC? 三、Major GC1、什么是Major GC?2、什么情况下会触发Major GC&#xff1f…...

Asp.Net MVC 使用Log4Net

Asp.Net MVC 使用Log4Net 在 ASP.NET MVC 中使用 Log4net 需要进行一些配置和代码集成。下面是在 ASP.NET MVC 中使用 Log4net 的步骤: 1. 安装 Log4net NuGet 包 打开 NuGet 包管理器控制台,并运行以下命令来安装 Log4net: Install-Pack…...

[元带你学: eMMC协议 29] eMMC 断电通知(PON) | 手机平板电脑断电通知

依JEDEC eMMC及经验辛苦整理,原创保护,禁止转载。 专栏 《元带你学:eMMC协议》 内容摘要 全文 2000 字, 主要内容 前言 断电通知是什么? 断电通知过程...

vue使用recorder-core.js实现录音功能

下载组件 npm install recorder-core封装方法 record.ts //必须引入的核心 import Recorder from recorder-core;//引入mp3格式支持文件;如果需要多个格式支持,把这些格式的编码引擎js文件放到后面统统引入进来即可 import recorder-core/src/engine/…...

ThinkPHP8知识详解:给PHP8和MySQL8添加到环境变量

在PHPenv安装的时候,环境变量默认的PHP版本是7.4的,MySQL的版本是5.7的,要想使用ThinkPHP8来开发,就必须修改环境变量,本文就详细讲解了如果修改PHP和MySQL的环境变量。 1、添加网站 启动phpenv,网站&…...

UE使用UnLua(二)

1.前言 最近也是比较忙,忘了来更新了,好多都是开了头断更的(狗头),今天抽空再更一篇!! 这篇讲一下在UnLua中覆盖蓝图事件(函数),及按钮、文本控件的一些使用…...

Appium+python自动化(二十五)-获取控件ID(超详解)

简介 在前边的第二十二篇文章里,已经分享了通过获取控件的坐标点来获取点击事件的所需要的点击位置,那么还有没有其他方法来获取控件点击事件所需要的点击位置呢?答案是:Yes!因为在不同的大小屏幕的手机上获取控件的坐…...

SDWAN组网的九大应用场景

SD-WAN(软件定义广域网)是一种新兴的网络技术,它可以优化和管理企业广域网(WAN)的数据传输,提供更加高效、灵活和安全的网络连接。SD-WAN的出现极大地改变了传统WAN的组网方式,为企业提供了更多…...

el-date-picker时间范围只能选五分钟之内

el-date-picker时间范围只能选五分钟之内 一、主要代码 一、主要代码 <el-date-pickertype"datetime"size"small"value-format"yyyy-MM-dd HH:mm:ss"v-model"searchData.submitTimeCode":editable"false"placeholder&qu…...

大数据分析案例-基于LightGBM算法构建乳腺癌分类预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

Java中的io流

File文件类 1.访问文件名相关的方法 String getName():返回此File对象所表示的文件名或路径名&#xff08;如果是路径&#xff0c;则返回最后一级子路径名)。 String getPath():返回此File对象所对应的路径名。File getAbsoluteFile():返回此 File对象的绝对路径。 String getA…...

23 自定义控件

案例&#xff1a;组合Spin Box和Horizontal Slider实现联动 新建Qt设计师界面&#xff1a; 选择Widget&#xff1a; 选择类名&#xff08;生成.h、.cpp、.ui文件&#xff09; 在smallWidget.ui中使用Spin Box和Horizontal Slider控件 可以自定义数字区间&#xff1a; 在主窗口w…...

从原理到实践,分析 Redisson 分布式锁的实现方案(二)

上篇讲解了如何用 Redis 实现分布式锁的方案&#xff0c;它提供了简单的原语来实现基于Redis的分布式锁。然而&#xff0c;Redis作为分布式锁的实现方式也存在一些缺点。本文将引入Redisson来实现分布式锁。 一、Redisson是什么 Redisson是一个基于Redis的分布式Java框架。它提…...

QT【day3】

思维导图&#xff1a; 闹钟&#xff1a; //widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTimerEvent> #include<QTimer> #include<QTime> //时间类 #include<QPushButton> //按钮类头文件 #include<QDebug&…...

模版模式和策略模式的区别

前言 模版模式和策略模式在日常开发中经常遇到&#xff0c;这两个设计模式有啥区别&#xff0c;这里简单总结下。 模版模式简单demo // 抽象模板类 abstract class AbstractClass {// 模板方法定义了算法的骨架public void templateMethod() {// 执行固定的步骤step1();step…...

Github搭建个人博客全攻略

Github搭建个人博客全攻略 一、Github二、配置博客仓库三、配置Git用户SSH密钥四、Deploy Key or Token方法一&#xff1a; Deploy Key方法二&#xff1a; Token 五、Hexo六、 主题七、 发布博文八、参考链接 一、Github Github是开发者的代码仓库&#xff0c;一个开源和分享社…...

gensim conherence model C_V 值与其他指标负相关BUG

在我用gensim3.8.3 conherence model分析京东评论主题模型时&#xff0c; C_V 与npmi、u_mass出现了强烈的皮尔逊负相关&#xff1a; 这些地方也反映了类似问题&#xff1a; https://github.com/dice-group/Palmetto/issues/12 https://github.com/dice-group/Palmetto/issue…...

QT DAY3

1.思维导图 2.完成闹钟的实现 头文件 #include <QTextToSpeech> #include <QTextEdit> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTQLineEdit *edit1new QLineEdit;// QTextEdit *edit2new QTe…...

TortoiseGit(小乌龟)使用问题总结

1.git clone fatal authentication failed for ‘请求路径‘&#xff0c; git clone 用户没有权限 待定 参考&#xff1a; 1.git clone fatal authentication failed for ‘请求路径‘&#xff0c; git clone 用户没有权限_git clone fatal: authentication failed for_椰子…...

106、Redis和Mysql如何保证数据一致

Redis和Mysql如何保证数据一致 先更新Mysql,再更新Redis,如果更新Redis失败,可能仍然不一致先删除Redis缓存数据,再更新Mysql,再次查询的时候在将数据添加到缓存中,这种方案能解决1方案的问题,但是在高并发下性能较低,而且仍然会出现数据不一致的问题,比如线程1删除了…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...