「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 的频率和时间,可以采取以下策略:
调整堆内存大小:适当设置堆内存大小,避免过小或过大的情况。优化对象分配:减少临时对象的创建和使用,避免过多的对象进入老年代。设置合适的垃圾回收器:根据应用程序的需求和性能特点,选择合适的垃圾回收器和相应的配置参数。进行代码优化:减少内存泄漏和不必要的对象引用,使垃圾回收更高效。
需要注意的是,Full GC 是一项比较重型的操作,在设计和调优应用程序时需要综合考虑内存分配、垃圾回收和应用程序的执行性能,以达到良好的性能和响应速度。
2、什么情况下会触发full gc?
Full GC(Full Garbage Collection)在Java虚拟机(JVM)中触发的情况主要有以下几种:
Minor GC后老年代空间不足:Minor GC(新生代垃圾回收)时,如果存活的对象无法全部放入老年代,或者老年代空间不足以容纳存活的对象,则会触发Full
GC,对整个堆内存进行回收。
显式调用System.gc():尽管调用System.gc()方法不能保证立即进行Full GC,但它可以向JVM建议执行垃圾回收操作,包括Full GC。不过,频繁调用System.gc()是不推荐的。
永久代空间不足(仅适用于JVM 8及之前版本):在传统的JVM版本中,永久代(Permanent Generation)用于存储类和方法相关信息。如果永久代空间不足,JVM会触发Full GC来清理永久代。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。
存活对象晋升:当年轻代经历了多次垃圾回收后,仍然存活的对象会被移到Survivor区。当Survivor区无法容纳所有存活的对象时,一部分对象将被晋升到老年代。在晋升对象时,也可能触发Minor
GC。
动态年龄判定:在年轻代进行垃圾回收时,会根据对象的年龄来决定是否晋升到老年代。具体地,当某个对象经过一次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来回收老年代的垃圾对象。
永久代垃圾回收:如果使用的是传统的垃圾回收器(如Parallel GC、CMS等),那么Major GC也会包含对永久代(Permanent Generation)的垃圾回收操作,用于清理无效的类定义、常量等。
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虚拟机中会在以下情况下被触发:
老年代空间不足:当老年代(Tenured Generation)无法容纳新对象或晋升对象时,会触发Major GC来回收老年代的垃圾对象。这种情况通常发生在频繁创建大对象或者持久对象导致老年代空间快要满了的情况下。
晋升(Promotion)失败:在年轻代(Young Generation)中的对象经过多次Minor GC后仍然存活并且达到了晋升的条件,但是老年代空间不足以容纳它们时,也会触发Major
GC。这种情况可能是因为年轻代中的对象生命周期较长,导致垃圾对象聚集在老年代中。
空间分配担保失败:在进行Minor GC时,如果老年代的连续内存空间不足以容纳晋升对象,JVM会尝试进行一次Minor GC并且通过移动对象来释放更多的连续空间。如果这个过程之后仍然无法满足空间需求,那么会触发Major GC。
显式调用:通过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虚拟机中的垃圾回收操作,它们在执行对象和目的上存在一些区别。
执行对象:
- Major GC:主要对老年代(Tenured Generation)进行垃圾回收操作,清理长生命周期的对象或经过多次Minor GC后仍然存活的对象。
- Full GC:涵盖了整个堆内存,包括年轻代和老年代,在进行垃圾回收时会同时处理这两个区域的对象。
目的:
- Major GC:专注于回收老年代中的垃圾对象,以释放老年代的内存空间。
- Full GC:除了回收老年代中的垃圾对象外,还会执行其他与垃圾回收相关的任务,如处理永久代中的无效类及常量,并进行堆内存的整理和碎片整理等工作。
触发条件:
- Major GC:由JVM自动触发,通常在老年代空间不足、晋升对象或永久代垃圾回收等情况下触发。
- Full GC:触发条件相对复杂,可能在年轻代无法容纳对象、永久代满了、显式调用System.gc()等情况下触发。
停顿时间:
- 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?…...
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算法构建乳腺癌分类预测模型
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...
Java中的io流
File文件类 1.访问文件名相关的方法 String getName():返回此File对象所表示的文件名或路径名(如果是路径,则返回最后一级子路径名)。 String getPath():返回此File对象所对应的路径名。File getAbsoluteFile():返回此 File对象的绝对路径。 String getA…...
23 自定义控件
案例:组合Spin Box和Horizontal Slider实现联动 新建Qt设计师界面: 选择Widget: 选择类名(生成.h、.cpp、.ui文件) 在smallWidget.ui中使用Spin Box和Horizontal Slider控件 可以自定义数字区间: 在主窗口w…...
从原理到实践,分析 Redisson 分布式锁的实现方案(二)
上篇讲解了如何用 Redis 实现分布式锁的方案,它提供了简单的原语来实现基于Redis的分布式锁。然而,Redis作为分布式锁的实现方式也存在一些缺点。本文将引入Redisson来实现分布式锁。 一、Redisson是什么 Redisson是一个基于Redis的分布式Java框架。它提…...
QT【day3】
思维导图: 闹钟: //widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTimerEvent> #include<QTimer> #include<QTime> //时间类 #include<QPushButton> //按钮类头文件 #include<QDebug&…...
模版模式和策略模式的区别
前言 模版模式和策略模式在日常开发中经常遇到,这两个设计模式有啥区别,这里简单总结下。 模版模式简单demo // 抽象模板类 abstract class AbstractClass {// 模板方法定义了算法的骨架public void templateMethod() {// 执行固定的步骤step1();step…...
Github搭建个人博客全攻略
Github搭建个人博客全攻略 一、Github二、配置博客仓库三、配置Git用户SSH密钥四、Deploy Key or Token方法一: Deploy Key方法二: Token 五、Hexo六、 主题七、 发布博文八、参考链接 一、Github Github是开发者的代码仓库,一个开源和分享社…...
gensim conherence model C_V 值与其他指标负相关BUG
在我用gensim3.8.3 conherence model分析京东评论主题模型时, C_V 与npmi、u_mass出现了强烈的皮尔逊负相关: 这些地方也反映了类似问题: 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 ‘请求路径‘, git clone 用户没有权限 待定 参考: 1.git clone fatal authentication failed for ‘请求路径‘, git clone 用户没有权限_git clone fatal: authentication failed for_椰子…...
106、Redis和Mysql如何保证数据一致
Redis和Mysql如何保证数据一致 先更新Mysql,再更新Redis,如果更新Redis失败,可能仍然不一致先删除Redis缓存数据,再更新Mysql,再次查询的时候在将数据添加到缓存中,这种方案能解决1方案的问题,但是在高并发下性能较低,而且仍然会出现数据不一致的问题,比如线程1删除了…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
