jvm之G1 GC

article/2025/9/1 8:58:17

写在前面

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.jarbogon: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+11using thread-local object allocation.
Garbage-First (G1) GC with 4 thread(s) -- 使用G1 GC,4个GC线程Heap Configuration:MinHeapFreeRatio         = 40MaxHeapFreeRatio         = 70MaxHeapSize              = 1073741824 (1024.0MB) -- 最大堆内存大小NewSize                  = 1363144 (1.2999954223632812MB) -- 新生代初始大小1MMaxNewSize               = 643825664 (614.0MB) -- 新生代最大大小614mOldSize                  = 5452592 (5.1999969482421875MB) 初始old区大小5mNewRatio                 = 2 young:old=1:2SurvivorRatio            = 8 eden:s0:s1=8:1:1MetaspaceSize            = 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,所以总大小为1gcapacity = 1073741824 (1024.0MB) -- 总大小1gused     = 47431216 (45.23393249511719MB) -- 已使用堆大小45mfree     = 1026310608 (978.7660675048828MB) -- 空闲堆大小978m4.417376220226288% used -- 使用量为4.4%
G1 Young Generation: -- 堆内存年轻代配置
Eden Space: -- young的edenregions  = 23 -- 一共23个regioncapacity = 53477376 (51.0MB) -- 容量是51mused     = 24117248 (23.0MB) -- 使用了23mfree     = 29360128 (28.0MB) -- 空闲28m45.09803921568628% used -- 使用率为45%
Survivor Space: -- 存活区regions  = 4 -- 一共4个regioncapacity = 4194304 (4.0MB) -- 总大小4mused     = 4194304 (4.0MB) -- 已使用4mfree     = 0 (0.0MB) -- 空闲0m100.0% used -- 使用率100%
G1 Old Generation: -- 堆内存老年代regions  = 19 -- 一共19个regioncapacity = 39845888 (38.0MB) -- 总容量38mused     = 19119664 (18.233932495117188MB) -- 已使用约18mfree     = 20726224 (19.766067504882812MB) -- 空暇约19m47.98403288188734% used -- 使用率约48%22285 interned Strings occupying 2350032 bytes.

写在后面


http://chatgpt.dhexx.cn/article/R1raWvEy.shtml

相关文章

G1 GC详解及设置

一、概述 G1 GC,全称Garbage-First Garbage Collector,在JDK1.7中引入了G1 GC,从JAVA 9开始,G1 GC是默认的GC算法。通过-XX:UseG1GC参数来启用。G1收集器是工作在堆内不同分区上的收集器,分区既可以是年轻代也可以是老…

java 并g1_JVM G1详解

java程序性能 当我们调优java程序时,通常的目标有两个: 响应能力 或者 吞吐量 响应能力 响应能力指一个程序或者系统对请求的是否能够及时响应。 比如: 一个桌面UI能多快的响应一个事件; 一个网站能够多快返回一个页面请求&#x…

垃圾回收之G1收集过程

G1 中提供了 Young GC、Mixed GC 两种垃圾回收模式,这两种垃圾回收模式,都是 Stop The World(STW) 的。 G1 没有 fullGC 概念,需要 fullGC 时,调用 serialOldGC 进行全堆扫描(包括 eden、survivor、o、perm&#xff0…

G1调优分析

目录 1、畅想GC的目标 2、jvm调优的目标 3、GC调优时机 4、垃圾收集器的选择 5、G1调优策略 6、G1垃圾收集实践 6.1、JVM自动选择垃圾收集器 6.2、G1垃圾收集 6.3、GC日志分析 7、小结 前言 c和java之间有一堵由内存动态分配和垃圾收集技术所围成的墙,墙外面的人想进…

JVM垃圾回收器G1详解

1、概述 在我们应用程序所应对的业务越来越庞大、复杂,用户越来越多,没有GC就不能保证应用程序正常进行,而经常造成STW的GC又跟不上实际的需求,我们需要不断地尝试对GC进行优化。G1(Garbage-First)垃圾回收…

G1垃圾回收器

1、最大堆大小 G1管理的最大堆大小为64G。每个Region的大小通过 -XX:G1HeapRegionSize 来设置,大小为 1~32MB ,默认最多可以有2048个Region,G1能管理的最大堆内存是 32MB*204864G 。 使用G1垃圾回收器最小堆内存应为 1MB*20482GB &#xff…

ZGC都出来了,你还不懂G1?

概念 G1(Garbage-First Collector)是一种垃圾回收算法,最早在JDK 6 Update 14中作为实验性功能加入,并在JDK 7 Update 4正式JDK,之后在JDK 9 中成为默认垃圾回收算法,在JDK 10中优化了Full GC性能。 G1是一…

G1详解

一 G1收集器 g1收集器是一个面向服务端的垃圾收集器适用于多核处理器、大内存容量的服务端系统。 它满足短时间gc停顿的同时达到一个较高的吞吐量。 JDK7以上版本适用 “ 先介绍两个概念:吞吐量和响应能力,响应能力和吞吐量是评价一个系统的两个重要指标…

G1垃圾回收器详解

文章目录 前言一、思考问题二、官方文档三、基本介绍四、G1的内存模型五、G1的标记过程六、G1的垃圾回收1、G1过程梳理2、Young GC3、Mixed GC4、Full GC 七、参数介绍八、分析各阶段触发时机根据GC日志分析Young GC的触发时机根据GC日志分析并发标记的触发时机根据GC日志分析M…

G1 GC

G1GC基本概念 G1 GC可以看做是CMS GC的重大升级改造G1 GC的全称是Garbage-First,意为垃圾优先,哪一块的垃圾最多就优先清理他。G1 GC最主要的设计目标是:将STW停顿的时间和分布,变成可预期且可配置的。(默认200ms&…

G1垃圾回收器-----基本知识及原理解析

G1介绍(Garbage first) G1主要面向的是服务端的垃圾回收器。在G1之前,JVM的主要垃圾回收器采用的是物理分代的思想,将内存区域严格的划分成年轻代(young GC)和老年代(major GC)&…

可控硅BT136典型应用电路

1.双向可控硅SCR可根据负载功率大小选择97A6(约1A)、TLC336A(约3A)、BT136-500D(约6A)中的一个,选择原则是触发电流要小于25mA。 2.C4取值在0.1 ~ 0.47uF之间&#xff0c…

全能电子地图实时路况_全能SUV与城市SUV的区别在哪?日产奇骏对比本田皓影

在如今的市场中,越来越多的车企将重点放在SUV车型中,尤其今年大量家用SUV涌入市场,特别是紧凑级SUV将这片市场瓜分的“支离破碎”。即使车型越来越多,市场被瓜分的越来越小,但是在很多消费者心中,几个主流品…

音质卓越颜值在线,五款高人气头戴式HIFI音质蓝牙耳机排名

随着我们生活水平的逐渐提高,我们对科技产品的要求也就越来越高,就拿耳机来说,对于很多上班族或是年轻人耳机绝对是出门或是旅行的必备品之一,没有音乐的路途那绝对是缺少了灵魂,那自然耳机的地位也就越发的重要。无线,音效,小巧,这几个因素也就成为了我们选择耳机的最…

服务器购买及宝塔部署环境说明(阿里云为例)

服务器相关知识 为什么程序员都需要自己的服务器? 1、你作为一个程序员,必须要发部自己的网站和项目! 2、联系Linux的操作。 3、自己的远程仓库、远程数据库、远程tomcat…都可以搭建在服务器上 4、联系,Linux进行任意的环境…

Linux学习一概述和环境搭建(入门概述,环境搭建,走近Linux系统)

此文档学习来自b站遇见狂神说,自己做的学习笔记整合。 狂神说Linux 继续Java全栈开发的Linux,而不是运维级别! 我们为什么要在这个时间学习Linux?Java全栈开发的我们要掌握哪些知识?需要准备什么工作? J…

CK6855M1蓝牙离线语音识别灯控模组使用说明书

CK6855M1蓝牙离线语音识别灯控模组使用说明书 一、功能说明 CK6855M1模块是一款专为灯具照明产品设计的离线蓝牙语音识别模组。模组支持红外遥控接收,支持RGBWY灯控制,支持无极调光,支持AD按键调灯以及音频上下曲的控制,支持5.1…

为什么P2P模式下载的人越多速度越快,为什么P2P伤害机械硬盘

台风来临前的夜晚,有点激动不想睡觉,看了几个电影,日本恐怖片,台风雨夜,非常不错,P2P很流畅,观察IP地址大量也是附近的,江浙沪,难道也都在迎台风看电影? 大家…

伊人在线高清视频 index.php,《天元》“畅音阁”首发飞行技能视频

直面一款网游给人感觉的优异度最大成分中的重中之重就是第一感——“视听”印象。一直以来,游戏音乐以及画面成分的优异华丽与否直接关系到了玩家对于此款游戏的好感度,无可厚非。而《天元》特别针对于此,倾情打造出一篇关于对于其所有“视听…

迅雷跃居全球BT市场第一

据torrentfreak报道,根据早些时候海盗湾公布的一些数据表明,全球BT软件的使用者,大约有三分之一来自中国,而来自美国的仅有8%,迅雷成为全球BitTorrent市场份额最大的客户端。 迅雷本身并不是一个专门使用P2P的BT客户端…