jvm之G1 GC

news2025/1/11 19:53:52

写在前面

jdk9以及之后的版本已经将默认的垃圾收集器parallel更换为G1.本文就一起来看下。

1:G1介绍

parallel GC的设计目标是高吞吐量,CMS GC的设计目标是低延迟,而G1的设计目标不是这二者中的任何一个,其设计目标是让GC的STW时间变的可控和可配置,具体的实现方案是将内存划分为多个region,默认是2048个,每个region可能是old区,eden区,也可能是survivor区,并且随着程序的运行可能会随时发生转变,如下图:

在这里插入图片描述

每次GC时会处理所有的年轻代(eden region和survivor region),以及部分的老年代,这些需要垃圾回收的region叫做回收集(collection set),如下图打对号的:
在这里插入图片描述

2:G1重要参数

  • -XX:+UseG1GC
    启用G1 GC
  • -XX:G1NewSizePercent
    初始年轻代占用整个堆的百分比,默认时5%
  • -XX:G1MaxNewSizePercent
    年轻代占用堆最大的百分比,默认是60%
  • -XX:G1HeapRegionSize
    设置region的大小,单位是MB,需要设置为2的次幂值,当大对象无法分配时可以适当将该值调大
  • -XX:ConcGCThreads
    与Java应用一起执行的GC线程数量,该值越低则系统的吞吐量越大,但过低会导致GC时间过长
  • -XX:InitiatingHeapOccupancyPercent
    当老年代垃圾达到指定百分比时,开始老年代的并行回收。即该值决定了什么时候启动老年代GC,默认时45%
  • -XX:G1HeapWastePercent
    当垃圾占用百分比达到多少时,停止GC,默认是5%,即每次GC并不会回收所有的垃圾对象,部分垃圾对象会留到之后的GC进行回收
  • -XX:GCTimeRatio
    设置GC占用的CPU时间和工作线程占用CPU时间的比例,计算公式100/(1+GCTimeRatio),G1默认值为9,则10%的时间会用在GC上,parallel默认值是99,则1%的时间会用在GC上
  • -XX:MaxGCPauseMillis
    设置每次GC的暂停时间,单位毫秒,G1会尽量维持在这个时间,但不保证绝对是,即如果设置50ms,最终GC时间100,200ms都是有可能的

3:G1的不足

当在某些情况下G1触发了FULL GC,将会退化为serial GC使用单线程的方式来进行垃圾回收,可能发生原因以及处理办法如下。

3.1:老年代被填满

这种情况一般是因为参与GC的线程数过少,无法快速的进行垃圾回收,导致老年代填满,解决办法是通过参数-XX:ConcGCThreads调大参与GC的线程数

3.2:巨型对象分配失败

对象过大,无法找到一个可用的region,则会触发FULL GC,解决办法是通过参数-XX:G1HeapRegionSize调大region的大小,或者是增加整个堆内存大小,从而间接增大单个region的大小

4:G1参数配置

测试使用的jar从这里 下载。

首先使用G1相关的配置启动程序,如下:

bogon:~ xb$ java -version
java version "9.0.4"
Java(TM) SE Runtime Environment (build 9.0.4+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode)

bogon:temp xb$ java -Xmx1g -Xms1g -XX:+UseG1GC -XX:-UseAdaptiveSizePolicy -XX:MaxGCPauseMillis=200 -jar gateway-server-0.0.1-SNAPSHOT.jar 

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.4.RELEASE)

查看堆快照:

bogon:temp xb$ jps -l
1939 jdk.jcmd/sun.tools.jps.Jps
1576 gateway-server-0.0.1-SNAPSHOT.jar

bogon:temp xb$ jhsdb jmap --heap --pid 1576
Attaching to process ID 1576, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 9.0.4+11

using thread-local object allocation.
Garbage-First (G1) GC with 4 thread(s) -- 使用G1 GC,4个GC线程

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 1073741824 (1024.0MB) -- 最大堆内存大小
   NewSize                  = 1363144 (1.2999954223632812MB) -- 新生代初始大小1M
   MaxNewSize               = 643825664 (614.0MB) -- 新生代最大大小614m
   OldSize                  = 5452592 (5.1999969482421875MB) 初始old区大小5m
   NewRatio                 = 2 young:old=1:2
   SurvivorRatio            = 8 eden:s0:s1=8:1:1
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB -- 最大metaspace无限大,天文数字,即不限制
   G1HeapRegionSize         = 1048576 (1.0MB)  -- 每个region的大小1m,没有设置是默认大小

Heap Usage:
G1 Heap: -- 堆配置(young+Old)
   regions  = 1024 -- 一共1024个region,每个regsion 1m,所以总大小为1g
   capacity = 1073741824 (1024.0MB) -- 总大小1g
   used     = 47431216 (45.23393249511719MB) -- 已使用堆大小45m
   free     = 1026310608 (978.7660675048828MB) -- 空闲堆大小978m
   4.417376220226288% used -- 使用量为4.4%
G1 Young Generation: -- 堆内存年轻代配置
Eden Space: -- young的eden
   regions  = 23 -- 一共23个region
   capacity = 53477376 (51.0MB) -- 容量是51m
   used     = 24117248 (23.0MB) -- 使用了23m
   free     = 29360128 (28.0MB) -- 空闲28m
   45.09803921568628% used -- 使用率为45%
Survivor Space: -- 存活区
   regions  = 4 -- 一共4个region
   capacity = 4194304 (4.0MB) -- 总大小4m
   used     = 4194304 (4.0MB) -- 已使用4m
   free     = 0 (0.0MB) -- 空闲0m
   100.0% used -- 使用率100%
G1 Old Generation: -- 堆内存老年代
   regions  = 19 -- 一共19个region
   capacity = 39845888 (38.0MB) -- 总容量38m
   used     = 19119664 (18.233932495117188MB) -- 已使用约18m
   free     = 20726224 (19.766067504882812MB) -- 空暇约19m
   47.98403288188734% used -- 使用率约48%

22285 interned Strings occupying 2350032 bytes.

写在后面

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

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

相关文章

我的世界Fabric mod开发-快速漏斗

前往我的主页以阅读完整内容,并获取源码 DearXuan的主页 MOD介绍 使用漏斗链进行分类或传递物品时,常常会发现漏斗速度太慢,难以收集全部掉落物.或者漏斗太多,影响性能.而现有的漏斗加速mod则是引入新的快速漏斗,存在各种兼容问题.开服时发现paper服务器可以修改原…

华为OD机试真题 Java 实现【区间连接器】【2023Q1 200分】

一、题目描述 有一组区间 [a0, b0], [a1, b1], … (a, b 表示起点, 终点),区间有可能重叠、相邻,重叠或相邻则可以合并为更大的区间; 给定一组连接器[x1, x2, x3, …](x 表示连接器的最大可连接长度,即 x>gap&…

支付宝沙箱支付(java电脑版)

目录 下载支付demo配置环境AlipayConfig 下载支付demo 网址&#xff1a;https://open.alipay.com/ 下载并打开项目发现无法运行&#xff1a; 手动转化项目&#xff1a; 等待下载整理一下maven pom 通过tomat部署运行测试。 导入阿里支付的pom依赖 <dependency> &l…

都2023了,你竟然还不知道网络安全该怎么学

前言 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然或恶意原因而遭受破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断。网络安全因何而重要&#xff1f; 截至2023年4月,我国网民规模为_11.51亿_&#xff0c…

模板初阶(泛型编程)

模板初阶 &#x1f506;泛型编程&#x1f506;函数模板函数模板概念函数模板格式函数模板的原理函数模板的实例化模板参数的匹配原则 &#x1f506;类模板类模板的定义格式类模板的实例化类模板与模板类的区别 &#x1f506;结语 &#x1f506;泛型编程 泛型编程&#xff1a;编…

【总结】Numpy2

Numpy 1. 数组和数的运算 array1 np.arange(1,10) array1 # array([1, 2, 3, 4, 5, 6, 7, 8, 9]) array1 10 # array([11, 12, 13, 14, 15, 16, 17, 18, 19]) array1 - 10 # array([-9, -8, -7, -6, -5, -4, -3, -2, -1]) array1 * 10 # array([10, 20, 30, 40, 50, 60, 70…

Flutter:如何在Android中实现串口通信调试

本文介绍如何通过flutter_libserialport插件在Flutter中实现串口通信调试。 1、引入依赖 在flutter工程的pubspec.yaml文件中引入flutter_libserialport依赖&#xff1a; dependencies:flutter_libserialport: ^0.3.0 2、导入import依赖包 在dart代码中import导入flutter_li…

快手国际化 后端开发面经二面

目录 1.Redis用的什么数据类型2.Hash底层结构3.JVM垃圾判别阶段算法4.MySQL索引模型5.为什么用B树6.联合索引在B树如何构造的7.覆盖索引知道吗 1.Redis用的什么数据类型 1.String(字符类型) 2.Hash(散列类型) 3.List(列表类型) 4.Set(集合类型) 5.SortedSet(有序集合类型&…

设计模式 单例模式(创建型)

一、前言 学习设计模式我们关注的是什么&#xff0c;如何实现么&#xff1f;是也不是。我认为比了解如何实现设计模式更重要的是这些设计模式的应用场景&#xff0c;什么场景下我们该用这种设计模式&#xff1b;以及这些设计模式所包含的思想&#xff0c;最终帮助我们把代码写…

继承 + 多态 + final + 权限修饰符

目录 继承 多态 final 权限修饰符 继承 继承定义&#xff1a; 可以让类跟类之间产生子父的关系继承的好处 可以把多个子类中重复的代码抽取到父类中&#xff0c;子类可以直接使用&#xff0c;减少代码几余&#xff0c;提高代码的复用性子类继承内容 非私有private构造方法…

#机器学习--深度学习中的正则化

#机器学习--深度学习中的正则化 引言1、参数范数惩罚2、 L 2 L^{2} L2 正则化3、 L 1 L^{1} L1 正则化4、显式约束和重投影5、参数绑定和参数共享6、Bagging7、Dropout 引言 本系列博客旨在为机器学习(深度学习)提供数学理论基础。因此内容更为精简&#xff0c;适合二次学习的…

uniapp实现条码扫描 可开闪光灯,原生H5调用,不需要任何sdk。

主要思路 使用QuaggaJs这个库。调用摄像头使用的 navigator.mediaDevices.getUserMedia 这个H5的api。通过 video 和 canvas 把摄像头获取到的数据展现到页面上&#xff0c;同时调用监听Quagga解析。 获取设备摄像头权限,用于后续开启摄像头。创建video元素显示摄像头画面,和ca…

AcWing算法提高课-1.3.10混合背包问题

宣传一下算法提高课整理 <— CSDN个人主页&#xff1a;更好的阅读体验 <— 本题链接&#xff08;AcWing&#xff09; 点这里 题目描述 有 N N N 种物品和一个容量是 V V V 的背包。 物品一共有三类&#xff1a; 第一类物品只能用1次&#xff08;01背包&#xff0…

opencv相机标定

当你把摄像机放在一个特定的位置&#xff0c;在它的后面放一个目标图像&#xff0c;或者是把摄像机放到某个物体上&#xff0c;摄像机周围的物体是什么形状&#xff0c;你需要知道这些信息。 当你在计算机上处理图像时&#xff0c;会使用以下三个参数&#xff1a; 1.像素坐标&a…

软件测试5年了,薪资25K,我还怕00后卷吗?

前言 沅哥在这个行业爬摸滚打5年了&#xff0c;从最开始点点点的功能测试到现在到现在成为高级测试&#xff0c;工资也翻了几倍&#xff0c;到了25k。他和我说&#xff0c;最开始他是想躺平的&#xff0c;后来也是被迫卷的&#xff0c;但好在这个结果他很满意。 之所以改变的…

一文3000字从0到1使用Selenium进行自动化测试

对于很多刚入门的测试新手来说&#xff0c;大家都将自动化测试作为自己职业发展的一个主要阶段。可是&#xff0c;在成为一名合格的自动化测试工程师之前&#xff0c;我们不仅要掌握相应的理论知识&#xff0c;还要进行大量的实践&#xff0c;积累足够的经验&#xff0c;以便快…

【重新定义matlab强大系列七】利用matlab函数ischange查找数据变化点

&#x1f517; 运行环境&#xff1a;matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

为了入职字节测试岗准备半年,上岸拿个30K应该不算高吧?

历时近半年的面试终于告一段落&#xff0c;终于有时间整理下自己这次的换工作心得&#xff0c;分享给大家。 面试经历 我的基本情况是这样&#xff1a;中下等 985 学校本科毕业&#xff0c;非计算机专业&#xff0c;在北京工作五年&#xff0c;之前一直在中小私企、国企工作。…

程序语言易错题

程序语言易错题 包含8个成员的开发小组的沟通路径最多有&#xff08;&#xff09;条。 A、28 B、32 C、56 D、64 解析 软件开发小组的沟通路径受到小组组织形式和规模的影响。若任意小组成员之间均可能有沟通路径&#xff0c;则可用完全连通图来对开发小组的沟通路径建模&#…

Anaconda-labelimg的使用

文章目录 一、创建Anaco的虚拟环境并激活二、下载labelimg以及使用1.下载2.使用 在这里我是创建了一个虚拟环境&#xff0c;虚拟环境名字为labelimg 之后将labelimg下载到该虚拟环境中 一、创建Anaco的虚拟环境并激活 conda create -n labelimg conda activate labelimg二、下…