Minor GC、Young GC、Full GC、Old GC、Major GC、Mixed GC 一文搞懂

news2024/11/24 20:45:48

简介

大家经常会看到各种各样的 GC 名称,比如:Minor GC、Young GC、Full GC、Old GC、Major GC、Mixed GC。

刚开始看到这么多 GC 名词后,真的是心累

哎,没办法,一声国粹之后也只能慢慢的把它们理理顺。

GC分类

我们现在先对其进行逐一分类:

  1. partial GC: 代表局部垃圾回收,可以有如下细分:

    • young GC(Minor GC): 指的是对新生代区域垃圾回收
    • old GC:指的是收集老年代,只有 CMS 的 concurrent collection是这个模式
    • Mixed GC:收集整个新生代,和部分老年代,只有G1有这个模式
  2. Full GC:收集整个过程,包括新生代、老年代、永久代(JDK8之前)

  3. Major GC:可以是指 old GC 也可以是指 Full GC。这是因为JVM规范没有对这些名词有具体的定义,时间久了后就使用混乱了。所以如果讨论 Major GC 的时候需要指定前提到底是讨论的是 old GC 还是 Full GC,比如周志明版的《深入理解虚拟机》就把 old GC 统称为 【Major GC / Full GC】更加不做区分了,这里我们先按照 old GC == Major GC 讨论

对象分配

这里我们先回顾一下虚拟机堆内存图:

在这里插入图片描述

首先对象一般都是在新生代中分配的,而且是在 Eden 区中。

一些大对象,比如数组,长字符串等会在老年代中分配,虚拟机提供了一个 -XX:PretenureSize 参数,如果对象大于这个设置的值就直接在老年代分配。

长期存活的对象将进入老年代,这里指的是当 Eden 区达到一定的比例后不能创建新对象,则触发垃圾回收(young GC),将无用对象清理掉,然后剩余对象复制到某个 Survivor1(S1) 中,同时清空Eden区。 当Eden区再次满了,会再次将 Eden 中的不能清空的对象存到另外一个 Survivor2(S2), 同时将S1区中的不能清空的对象,也复制到S2中,保证Eden和S1,均被清空。 重复多次(默认15次)Survivor中没有被清理的对象,则会复制到老年代Old(Tenured) 区中。对于晋升老年代的年龄阈值可以用 -XX:MaxTenuringThreshold 设置。

触发young GC

由于对象一般情况下是直接在新生代中的 Eden 区进行分配,如果Eden区域没有足够的空间,那么就会触发young GC(Minor GC)。因为 Java 对象大多数具备朝生夕死的特性,所以 young GC(Minor GC)会非常频繁,回收速度也非常快。

触发Full GC

Full GC 相对于 Minor GC 来说,停止用户线程的 STW(stop the world)时间过长,至少慢10倍以上,所以要尽量避免,首先说一下Full GC可能产生的原因,接着给出排查方法以及解决策略。

在代码中调用System.gc()方法会建议JVM进行Full GC,但是注意这只是建议,JVM执行不执行是另外一回事儿,不过在大多数情况下会增加Full GC的次数,导致系统性能下降,一般建议不要手动进行此方法的调用,可以通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc。

在YGC之前,会先检查老年代最大可用的连续空间是否大于新生代所有对象的总空间。如果小于,说明YGC是不安全的,则会查看参数 HandlePromotionFailure 是否被设置成了允许担保失败,如果不允许则直接触发Full GC;如果允许,那么会进一步检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果小于也会触发 Full GC

Metaspace(元空间)在空间不足时会进行扩容,当扩容到了-XX:MetaspaceSize 参数的指定值时,也会触发FGC

Major GC/Old GC

老年代会在两种情况下触发 Old GC:一是开启分配担保机制,根据历次 Minor GC 后进入老年代的对象大于当前老年代内存大小,判断 Minor GC 有风险,则会触发 Old GC;二是 Minor GC 后剩余对象太多,老年代放不下了也会触发 Old GC。

Mixed GC

Mixed GC是G1中特有的概念,当老年代内存占据到了45%就户触发Mixed GC,对新生代和老年代都进行回收。

好了今天就到这,之后会单独讨论 G1 收集器和 CMS 收集器。

作者:码小刀
链接:https://juejin.cn/post/7085174576950280200
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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

相关文章

(vue2)面经基础版-案例效果分析

配路由 先配一级,一级里面配二级。一级路由:首页(二级:嵌套4个小页面)、详情页 高亮a->router-link,高亮效果对自带高亮类名router-link(-exact)-active设置 注:通过children配置项&#…

【springboot源码】深度解析@Value赋值时机及底层原理

1.Value使用 Value主要是让我们程序动态的将外部值注入到bean中的,使用方式主要如下两种: 1.1Value("${}"):可以获取对应属性文件中定义的属性值。 1.2Value("#{}"):表示 SpEl 表达式通常用来获取 bean 的…

【操作系统】聊聊什么是CPU上下文切换

对于linux来说,本身就是一个多任务运行的操作系统,运行远大于CPU核心数的程序,从用户视角来看是并发执行,而在CPU视角看其实是将不同的CPU时间片进行分割,每个程序执行一下,就切换到别的程序执行。那么这个…

[激光原理与应用-70]:AD8512运算放大器的工作原理与连接电路

目录 概述: 一、AD8512的功能与主要特征 一、AD8510 1.1 管脚说明 1.2 电源电压 1.3 输入信号电压 1.4 偏置电压 1.5 参考连接 1.6 放大倍数 1.7 参考电路 二、AD8512 1.1 管脚说明 1.2 AD8512的电路连接 1.3 如何调整放大倍数 1.4 AD8512半波与全波…

基于 Socket 网络编程

基于 Socket 网络编程 前言一、基于Socket的网络通信传输(传输层)二、UDP 的数据报套接字编程1、UDP 套接字编程 API2、使用 UDP Socket 实现简单通信 三、TCP 流套接字编程1、TCP 流套接字编程 API2、使用 TCP Socket 实现简单通信3、使用 Tcp 协议进行…

【数据链路层】网络基础 -- MAC帧协议与ARP协议

数据链路层认识以太网以太网帧格式(MAC帧)认识MAC地址对比理解MAC地址和IP地址认识MTUMTU对IP协议的影响MTU对UDP协议的影响MTU对于TCP协议的影响 再谈局域网转发原理(基于协议)ARP协议ARP协议的作用ARP协议的工作流程ARP数据报的格式 数据链路层 用于两…

网工内推 | 雄岸区块链集团,网安工程师,HCIE-Security、CISP优先

01 雄岸区块链集团 招聘岗位:网络安全测试工程师 职责描述: 1、负责安全测试工作,包括渗透测试、漏洞分析、攻防演练和安全评估等。 2、发掘业务系统安全问题,跟进安全整改。 3、出现网络攻击或安全事件时,进行紧急…

Tensorrt8.6.1安装

环境配置:Tensorrt8.6.1 ,cuda11.6, cudnn8.6.0, torch1.13.1cu116, torchvision0.14.1cu116 1.先把cuda11.6, cudnn8.6.0, torch1.13.1cu116, torchvision0.14.1cu116这几个安装完之后 2.下载Tensorrt8.6.1,复制移动以下文件 将include中头…

Nat. Rev. Bioeng. | 中山大学左涛组详述肠道微生态工程化改造

肠道微生态工程化改造 Engineering the gut microbiome Review Article, 2023-6-16, Nature Reviews Bioengineering DOI:10.1038/s44222-023-00072-2 原文链接:https://www.nature.com/articles/s44222-023-00072-2 第一作者:Xiaowu Bai&…

近距离看GPU计算-1

文章目录 前言1.什么是GPU及其分类1.独立GPU(Discrete GPU)2.集成GPU(Integrated GPU)3.移动GPU(Mobile GPU) 2.GPU绘制流水线3.GPU计算的演进之旅1.CUDA的发明2.统一可编程单元3.浮点计算的标准化4.随机存取数据5.存储支持ECC 前言 转自 GPU and Computing 公众号 在前面文章…

Java实现单链表

目录 一.单链表 二.单链表基本操作的实现 1.单链表类、属性的定义 2.求链表长度 3.链表是否包含值为key的节点 4.添加元素 5.删除节点 6.清空链表 三、完整代码 一.单链表 链表是一种在物理存储结构上非连续的存储结构,数据元素的逻辑顺序通过链表中的引用…

【深度学习】卷积神经网络(LeNet)【文章重新修改中】

卷积神经网络 LeNet 前言LeNet 模型代码实现MINST代码分块解析1 构建 LeNet 网络结构2 加载数据集3 初始化模型和优化器4 训练模型5 训练完成 完整代码 Fashion-MINST代码分块解析1 构建 LeNet 网络结构2 初始化模型参数3 加载数据集4 定义损失函数和优化器5 训练模型 完整代码…

AIDAO,将会引领我们走向何方?

人工智能(AI)和分布式自治组织(DAO)都是区块链赛道的热门项目之一,他们看似在不同的领域独立发展,然而,它们之间也存在着巨大的协同潜力。 未来,AI有望成为推动DAO发展的重要动力&a…

【Java 基础篇】Java并发包详解

多线程编程是Java开发中一个重要的方面,它能够提高程序的性能和响应能力。然而,多线程编程也伴随着一系列的挑战,如线程安全、死锁、性能问题等。为了解决这些问题,Java提供了一套强大的并发包。本文将详细介绍Java并发包的各个组…

Docker网络问题:容器无法访问外部网络

Docker网络问题:容器无法访问外部网络 😟 Docker网络问题:容器无法访问外部网络 😟摘要 🤔引言 🌐正文 🤓为什么容器无法访问外部网络? 😕1. 网络配置错误2. 防火墙设置3…

WebGL 选中物体

目录 前言 如何实现选中物体 示例程序(PickObject.js) 代码详解 gl.readPixels()函数规范 示例效果 前言 有些三维应用程序需要允许用户能够交互地操纵三维物体,要这样做首先就得允许用户选中某个物体。对物体…

三维建模软件Cinema 4D 2024 mac(c4d2024)中文版特点

Cinema 4D 2024 mac是一款专业的三维建模、动画和渲染软件,c4d2024 可以用于电影制作、广告设计、工业设计等领域。 Cinema 4D 2024具有强大的建模工具,可以创建各种复杂的几何体,包括多边形网格、NURBS曲线和体积对象。它还提供了丰富的材质…

Docker快速入门到项目部署,MySQL部署+Nginx部署

《Docker》是微服务在企业落地的最后一块拼图。微服务项目由于拆分粒度细,服务部署环境复杂,部署实例很多,维护困难。而Docker则可以解决项目部署的各种环境问题,让开发、运维一体化,真正实现持续集成、持续部署。大大…

一文详解自动化测试框架知识

前言 自动化测试因其节约成本、提高效率、减少手动干预等优势已经日渐成为测试人员的“潮流”,从业人员日益清楚地明白实现自动化框架是软件自动化项目成功的关键因素之一。 我们将从什么是真正的自动化测试框架、自动化脚本如何工作以及自动化测试框架会如何在测…

three.js——辅助器AxesHelper和轨道控制器OrbitControls的使用

辅助器AxesHelper和轨道控制器OrbitControls的使用 前言效果图1、辅助器AxesHelper:是物体出现辅助的x/y/z轴2、轨道控制器OrbitControls2.1导入OrbitControls文件2.2 使用2.3 如果OrbitControls改变了相机参数,重新调用渲染器渲染三维场景 前言 1、AxesHelper 官网…