「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负责回收整个堆内存的垃圾对象,触发条件复杂且停顿时间较长。了解并合理配置这两种垃圾回收操作对于应用程序的性能表现和系统资源利用非常重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/15441.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android开发初体验

创建项目geoquiz 选择EmptyActivity 编程语言选择Kotlin 修改app/src/main/java/MainActivity.kt package com.bignerdranch.android.geoquizimport androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.View import android.widget.*cl…

Vue.js高阶学习和常用知识(二)

目录 1. Vue 实例2. 组件3. 指令4. 计算属性5. 监听器6. 生命周期钩子 Vue.js 是一个流行的 Web 前端框架,它由 Evan You 于 2014 年创建。Vue.js 的设计目标是简单、灵活和易于使用,同时具有高性能和可扩展性。 Vue.js 基于组件化的思想,将页…

Java并发系列之一:JVM线程模型

什么是线程模型: Java字节码运行在JVM中,JVM运行在各个操作系统上。所以当JVM想要进行线程创建回收这种操作时,势必需要调用操作系统的相关接口。也就是说,JVM线程与操作系统线程之间存在着某种映射关系,这两种不同维…

在OK3588板卡上部署模型实现OCR应用

一、主机模型转换 我们依旧采用FastDeploy来部署应用深度学习模型到OK3588板卡上 进入主机Ubuntu的虚拟环境 conda activate ok3588 安装rknn-toolkit2(该工具不能在OK3588板卡上完成模型转换) git clone https://github.com/rockchip-linux/rknn-to…

通过performance分析mysql内存占用

在 MySQL 使用过程中,偶尔会出现OOM、内存异常突增等异常现象。为了排查内存异常,我们需要分析内存占用情况,找出内存占用的具体事件。我们可以从以下几张performance下的表分析内存,每张表对应不同的维度,有用户维度、…

基于Java+spring+springMvc+mybatis+jsp学生选课管理系统

基于JavaspringspringMvcmybatisjsp学生选课管理系统 一、系统介绍二、功能展示1.课程列表(学生)2.已选课程(学生)3.已修课程(学生)4.我的课程(老师)5.课程打分(老师)6.课程管理、学生管理、教师管理(系统管理员&#…

stm32读取DHT11温湿度传感器

stm32读取DHT11温湿度传感器 一.序言二.DHT11响应数据格式三.DHT11通讯过程3.1 产生起始信号3.2 读取数据03.3 读取数据1DHT11停止信号 四.代码实例4.1读取DHT11源文件4.2 读取DHT11头文件 五.结语5.1 总结整体思路5.2 对读者的期望 一.序言 我们知道DHT11是单总线协议&#x…

django------模糊查询

1.常用模糊查询的方法 queryset中支持链式操作 bookBook.objects.all().order_by(-nid).first() 只要返回的是queryset对象就可以调用其他的方法,直到返回的是对象本身 大于、大于等于、小于、小于等于&#xff1a; # __gt 大于> # __gte 大于等于> # __lt 小于< …

Ceph入门到精通- Linux 磁盘管理(block 与 inode)

1 硬盘 block 与 inode 详解 1.1 Sector&#xff08;扇区&#xff09;与 Block&#xff08;块&#xff09; 1&#xff09; 硬盘的最小存储单位&#xff1a;sector&#xff08;扇区&#xff09;&#xff0c;每个扇区储存 512 字节&#xff1b;操作系统会一次性连续读取多个…

大语言模型LLM

目录 一、语言模型的发展 语言模型&#xff08;Language Model&#xff0c;LM&#xff09;目标是建模自然语言的概率分布&#xff0c;具体目标是构建词序列w1,w2,...,wm的概率分布&#xff0c;即计算给定的词序列作为一个句子出现可能的大小P(w1w2...wm)。但联合概率P的参数量…

【C++入门到精通】C++入门 —— 类和对象(初始化列表、Static成员、友元、内部类、匿名对象)

目录 一、初始化列表 ⭕初始化列表概念 ⭕初始化列表的优点 ⭕使用场景 ⭕explicit关键字 二、Static成员 ⭕Static成员概念 &#x1f534;静态数据成员&#xff1a; &#x1f534;静态函数成员&#xff1a; ⭕使用静态成员的优点 ⭕使用静态成员的注意事项 三、友…

Linux编译宏BUILD_BUG_ON_ZERO

本系列文章主要写我在阅读Linux内核过程中&#xff0c;关注的比较难以理解但又设计巧妙的代码片段&#xff08;不关注OS的各个模块的设计思想&#xff0c;此部分我准备写在“深入理解Linux Kernel”系列文章中&#xff09;&#xff0c;一来通过内核代码复习一下C语言及汇编语言…

go 中的代码漏洞检查

前言 不知道大家在开发 go 项目中有没有遇到过一些第三方包或者官方包中出现漏洞的问题&#xff0c;这些漏洞可能会影响到代码的功能、性能或者安全性。 现在针对这一问题&#xff0c;go 团队提供了 govulncheck 工具&#xff0c;帮助开发者快速地发现和修复这些漏洞。 什么…

C/C++开发,opencv与qt结合播放视频

目录 一、qt_ui创建 1.1 ui设置 1.2 ui及代码输出保存 二、创建工程 2.1 工程目录及编译设置 2.2 源码设计 三、编译及测试 3.1 程序编译 3.2 程序运行 首先声明&#xff0c;这是一个OpenCV 3学习文档的案例&#xff0c;但是说明有些过于省略&#xff0c;只有一些简短的代码…

计算机毕设 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

文章目录 0 前言1.前言2.实现效果3.相关技术原理3.1卷积神经网络3.1YOLOV5简介3.2 YOLOv5s 模型算法流程和原理4.数据集处理3.1 数据标注简介3.2 数据保存 5.模型训练 6 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题…

Clion开发Stm32之温湿度传感器(DS18B20)驱动编写和测试

前言 涵盖之前文章: Clion开发STM32之HAL库GPIO宏定义封装(最新版)Clion开发stm32之微妙延迟(采用nop指令实现)Clion开发STM32之日志模块(参考RT-Thread) DSP18B20驱动文件 头文件 /*******************************************************************************Copy…

1 MobileHomeTopicApplication

目录 1 OrderApplication 1.1 引用文件 1.2 #region 字段 1.3 #region 属性 OrderApplication 引用文件using System; using

react 父子组件通信 基础

父传子 使用props import { useState } from reactfunction Parent {const [message, setMessage] useState(react)return (<><SonA message{message} /><SonB message{message} /></>) }function SonA(props) {return <div>子组件A: {props.…

OAuth机制_web站点接入微软azure账号进行三方登录

文章目录 ⭐前言⭐微软三方登录流程&#x1f496; web站点获取微软账号流程&#x1f496; node封装微软登录接口&#x1f496; webapp 自定义code换token&#x1f496; 调用 Microsoft Graph API&#x1f496; 前端唤醒authlink进行登录回调逻辑 ⭐结束 ⭐前言 大家好&#xf…

sublime配置less的一些坑(1)

仅在sublime的Install Package安装保存less报错 在sublime的Install Package安装less 打开sublime软件,按住CtrlShiftP组合键,弹出的界面中选择Install Package 选中后enter或者回车。等会弹出一个弹窗,大致意思是说你已经成功安装了package control。如果你在此之前已经安装了…