JVM基础原理篇-带你深入拆解G1垃圾回收原理

一、一统天下的G1垃圾回收器概述

大白话:

        1.整个堆空间,新生代和老年代比例大概为2:8;

        2.正常情况下,新生代回收是高频的,混合回收是频率是适中的,完全回收则是基本不会发生、频率低代价高的,一旦发生距离系统崩溃不远矣。

大白话:

        1.Eden区不够了,触发YGC;

        2.新生代中的对象不断地晋升(满15次)老年代,当老年代达到阈值,则先触发混合回收,将新生代和部分老年代进行垃圾回收;

        3.如果回收后,老年代对象仍不够用,则会触发完全回收(FullGC);

        4.多次FullGC失败后,抛出OOM。

二、图解G1垃圾回收器YGC的基本原理与执行过程

大白话:

        1.方法区(元空间)所关联的类、对象,方法区里的东西一般是常驻内存的;

        2.正在执行的线程关联的类、对象,是不会被标记清除的;

        3.跨代引用,老年代引用了新生代对象,这些新生代对象也是不会被清除的;

这些对象都是可以作为GC root起点的。

大白话:

        我们通过对CMS的执行过程理解,首先是初始标记、并发标记、预处理、重新标记、并发清理、重置线程,而G1在标记为存活对象后,就立刻移动该对象到S区。

大白话:

        动态调整新生代区域region的数量 - 在G1里,在执行YGC的时候,新生代的数量是可以动态变化的,一般什么都不设置的情况下,Eden区占比例在5%~60%之间(调整的原因,是根据每次执行垃圾回收后,根据当前的情况判断增加region数量,每增加一个region数量,Eden区就会增加一个,如果没有必要,Eden数量太多,导致回收时间太长,这时JVM就会减少Eden区数量)。

大白话:

        当区块被回收后,就会变成自由分区(或者叫空白分区),再有G1根据情况决定,这个区块下一步分变为Eden区还是别的区块。

大白话:

        在G1不断地YGC后,当某一次YGC判断老年代空间可能不太够用,则为下一次可能执行的混合回收做准备,提前开启并发标记,提高回收效率。

大白话:

        并行执行的任务,一般是重要的,且耗时短的。

大白话:

        1.释放分区 - 释放分区,类似我们的格式化硬盘,工作比较简单也比较快,涉及到一些全局状态表、全局集合的调整,所以采用串行的方式比较好。

三、【场景演示】通过GC日子理解YGC基本过程

大白话:

        young - YGC

        GC Workers - 8个工作线程

        Ext Root Scanning - GCRoots扫描

注意

        [Ext Root Scanning (ms):  0.4  0.6  0.2  0.2  0.2  0.1  0.2  0.1,从这里可以看出,不同的线程消耗的时间为什么会差异这么大,是因为不同的CPU的工作任务不同。

大白话: 

        total - G1堆总大小;

        used - 已使用堆大小;

        region size - 堆分区大小;

        28 young(28672k) - 年轻代分区有28个,总大小28672k;

        1 survivors(1024k) - S区1个,总大小1024k;

[Eden:9216.0K(9216.0K)垃圾回收之前占用空间大小 -> 0.0B垃圾回收之后占用空间大小(31.0M Eden区对占用空间大小 Survivors:0.0B -> 1024.0K Heap:9216.0K(128.0M) -> 848.1K(128.0M))]

再执行一次程序代码,发现

通过这两次对比,可以看出Eden区的堆空间大小被调整了,且Eden区的堆大小在5%~60%之间。

四、【原理精讲】停顿预测模型与垃圾区域选择原理

在启动参数中,增加一个 -XX:MaxGCPauseMillis=1 (最大停顿时间1,单位为1毫秒)

发现进行了多次GC,原因是每次GC都会尽量满足最大挺短时间,导出的后果就是每次垃圾会输的时间缩短了。

因为设置了最大停顿时间,导致GC时间内能处理的东西减少 ,从而JVM自动缩小了Eden区的堆大小。

大白话:

        最大停顿时间,设置过小,导致GC时间内能处理的东西减少 ,从而JVM自动缩小了Eden区的堆大小,设置过大,则导致在YGC的时候,S区放不下

大白话:

        根据垃圾对象占对象的比例排序,如果本次能清理3个region,就1/2/3一起清理,如果只能清理2个就清理1/2,如果 只能清理1个region,就只清理1号region,选出来的region,放到CSet中。

五、【原理精讲】深入理解混合回收工作原理与执行过程

因为并发标记阶段耗时非常长,有些对象是死的,被标记成了活动,有些对象是活的被标记成了死的。

大白话:

        这里就是前面讲到的,怎么统计每个region的垃圾笔记、以及region回收排序。

大白话:

        1.混合回收前面为什么会有一次YGC呢,前面讲了混合回收的触发条件是,在YGC后,已分配的内存占总内存的45%,触发混合回收;

        2.并发标记,标记的什么呢,主要标记的是老年代的对象。

大白话:

        为什么存活对象数量大于 85%的region就不再回收,这是因为前面讲了,一边标记一边复制,最耗时的是复制移动对象,所以一旦超过85%的region,就没有放入CSet的中回收的必要。

大白话:

        也就说,要执行混合有两个条件,第一个,在YGC后,已分配的内存占总内存的45%,触发混合回收,第二个就是可回收的空间占总空间的比例大于5%,才会启动混合回收。如果低于5%,JVM认为启动混合回收的意义不大,所以不启动混合回收。

五、【场景演示】通过GC日志理解混合回收工作过程

将for循环改为500次:

通过检查GC日志,发现这一个YGC跟前面的YGC已经有了明显的区别,多做了一步初始标记操作,那么后面离它不远,就会有混合回收日志。

这里已经开始并发标记

开始混合回收

这一行表示,老年代空间已经不够使用,G1通过把新生代快速转为老年代,供老年代使用,出现这一行,表示离FullGC不远矣。

触发了2次FullGC

在FullGC后,又是YGC,说明暂时把系统救回来了

到最后,FullGC已经解决不了问题了,最终OOM了。

六、【原理精讲】深入理解FullGC工作原理与执行过程

大白话:

        FullGC执行时间非常长,大概2-3秒,如果执行一次仍然不够,会再次执行,第二次回收软引用,如果还不够用,对象仍然无法分配,系统基本上就要OOM了,所以FullGC是非常危险的,当出现FullGC,我们就应该进行检查,防止更大的风险发生。

大白话:

        标记活跃对象,是所有垃圾回收期的回收的前提。

七、【故障实战】大对象导致视频无法观看故障实战

大白话:

        经验证,G1采用的是第二种思路(即使用多个region)存放大对象。

        但是有个基本原则,大对象尽量不要放入老年代,因为老年代region是有数量限制的(默认2048个),如果存放大量大对象,会把老年代占满,一旦占满应用会非常容易崩掉。

问题:

        现在的手机拍摄的视频一般都几百兆甚至几个G。

大白话:

        手动加大region大小,这个时候,大对象就不会被视为大对象,也就不会直接放入老年代region。

在前边的代码里,增加设置-XX:G1HeapRegionSize=8M,加入region大小。同时将代码中的byte1024改为1022,让数据的大小变小,可以看到执行的是YGC。

八、为什么sublist会导致系统OOM?

原因:

        subList所在的大对象,只要一直有在被引用,就一直不会被回收,而其本身占用的堆内存也一直不会释放,所以不推荐使用。

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

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

相关文章

Unity之DOTweenPath轨迹移动

Unity之DOTweenPath轨迹移动 一、介绍 DOTweenPath二、操作说明1、Scene View Commands2、INfo3、Tween Options4、Path Tween Options5、Path Editor Options:轨迹编辑参数,就不介绍了6、ResetPath:重置轨迹7、Events:8、WayPoin…

什么是众创空间?他有什么特点?

众创空间,是一种为大众创新创业提供专业化服务的创业服务平台,是顺应网络时代创新创业特点和需求,通过市场化机制、专业化服务和资本化途径构建的低成本、便利化、全要素、开放式的新型创业服务平台的统称。众创空间包括创客空间、联合办公空…

KCTF2023_签到题 1

题目环境: 提示说只有管理员权限才可以访问 考虑到伪造Client-Ip准备工作: 所需工具:Kali、burp suite、火狐浏览器 抓包-伪造Client-Ip-放包 得到flag:flag{tdQvKTtPj7v1lbhkDPesHb}

postgres 使用函数批量分段删除与写入

一、 postgres使用函数批量删除数据万级数据 CREATE or REPLACE FUNCTION insert_many() RETURNS text as $$DECLAREr int;b_count int;insert_name VARCHAR;BEGINb_count : 22222;while b_count < 22299 LOOPr : (random() * 9000000)::INT;insert into test_effects(id,…

redis的搭建及应用(三)-Redis主从配置

Redis主从配置 为提升Redis的高可用性&#xff0c;需要搭建多个Redis集群以保证高可用性。常见搭建方式有&#xff1a;主从&#xff0c;哨兵集群等&#xff0c;本节我们搭建一主二从的多Redis架构。 redis主从安装1主2从的方式配置&#xff0c;以端口号为redis的主从文件夹。 主…

SpringMVC之获取请求参数和域对象共享数据

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

GitHub项目egg-info模块

egg-info 文件夹通常包含有关 Python 包&#xff08;package&#xff09;的元数据信息。这些信息包括包的名称、版本、作者、依赖项等。egg-info 文件夹的创建是由 setuptools 库负责的&#xff0c;它是 Python 的一个包管理工具。 在 Python 包的开发和分发过程中&#xff0c…

python作业题百度网盘,python作业答案怎么查

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python作业题百度网盘&#xff0c;python作业答案怎么查&#xff0c;今天让我们一起来看看吧&#xff01; 1 以下代码的输出结果为&#xff1a; alist [1, 2, 3, 4] print(alist.reverse()) print(alist) A.[4, 3, 2, …

Qt底层机制总结

Qt是一个跨平台的C++应用程序开发框架,具有丰富的功能和强大的底层机制,分别为: 1. 信号和槽(Signals and Slots): 信号和槽是Qt中一种用于对象间通信的机制。通过信号和槽,可以实现对象之间的事件传递和响应。信号被触发时会发送消息,槽函数则负责接收和处理这些消息…

Unity Timer两种计时器

Unity Timer两种计时器 Timer两种计时器一、倒计时计时器&#xff08;常用语UI倒计时显示&#xff09;计时器代码如下&#xff1a;用法如下&#xff1a; 二、技能CD计时器代码如下&#xff1a;使用方法如下&#xff1a; Timer两种计时器 一、倒计时计时器&#xff08;常用语UI…

从 Google Gemini 到 OpenAI Q*(Q-Star):调研重塑生成人工智能(AI)的研究

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 这篇综述探讨了生成式人工智能不断发展的前景&#xff0c;重点关注混合专家&#xff08;MoE&#xff09;、多模态学习的变革性影响&#xff0c;以及对…

解决xcode15下载模拟器慢以及没有断点续传

问题描述&#xff1a;Xcode15 为了最小化安装包大小&#xff0c;iOS17模拟器需要单独安装。然而下载模拟器的时候&#xff0c;经常出现Could not download iOS... 的下载失败提示。 以下为解决方案&#xff1a; 一、直接下载IOS17模拟器的包 以下两种方式都可以 方法一&…

学习笔记:数据挖掘与机器学习

文章目录 一、数据挖掘、机器学习、深度学习的区别&#xff08;一&#xff09;数据挖掘&#xff08;二&#xff09;机器学习&#xff08;三&#xff09;深度学习&#xff08;四&#xff09;总结 二、数据挖掘体系三、数据挖掘的流程四、典型的数据挖掘系统 一、数据挖掘、机器学…

delphi中format日期格式的小要点

我要delphi中要用到会计期间的比较&#xff0c;环境是sqlserver数据库&#xff0c;用sql语句查询某一会计月度的数据记录。 1、问题 我先到的语句是 select count(*) as cnt from 销售订单 where format(日期,yyyy.mm)2023.12 数据库中明明是有2023.12的数据的&#xff0c;…

SpringBoot实用开发(一)-- SpringBoot整合Redis

目录 引言: 1. Redis的安装 2. Redis客户端的简单操作 2.1 启动客户端

CCRC信息安全认证适用的什么领域,申报材料是什么?

CCRC信息安全认证适用的领域主要包括信息安全服务领域&#xff0c;它涵盖了安全集成、安全运维、应急处理、风险评估、灾难备份与恢复、安全软件开发、网络安全审计、工业控制系统安全等多个方面。这些领域涉及到企业信息系统的安全保障&#xff0c;确保信息系统在开发、运行、…

2023:代码岁月如歌,技术之路踏实前行

前言 转眼之间&#xff0c;2023年即将谢幕&#xff0c;这一年对于我而言充满了挑战、收获与成长。在这篇博客中&#xff0c;我将分享我在技术领域的一些心得体会&#xff0c;以及在项目和职场中的所思所感。愿这些文字能够为你带来启发&#xff0c;同时让我能够在反思中更进一…

Vuex状态管理(报警信息数量跟随变化)

需求&#xff1a;侧边栏显示报警信息数量 在store/project.js文件中定义相关状态 // 存储项目信息 const projectInfo JSON.parse(sessionStorage.getItem(projectInfo)) ? JSON.parse(sessionStorage.getItem(projectInfo)) : ; import { getUntreatedProjectAlarm } from …

react跳转和传参两种方式

需要安装ReactRouter包&#xff1a;npm i react-router-dom 两种跳转方式分别是Link和useNavigate&#xff0c;下面跳转传参会有所展示 1.useSearchParams传参 传参代码 //传参方代码 import { Link, useNavigate } from "react-router-dom" const Login () >…

ASP.NET Core认证原理和实现

ASP.NET Core认证原理和实现 AuthenticationHttpContextExtensions AuthenticationHttpContextExtensions 类是对 HttpContext 认证相关的扩展&#xff0c;它提供了如下扩展方法&#xff1a; public static class AuthenticationHttpContextExtensions {public static Task&l…