「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删除了…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...
