Java性能-理解G1 垃圾回收器

news2024/10/1 19:32:11

垃圾回收算法

理解G1 垃圾回收器

G1是在堆内离散的区域进行,各个区域(默认2048个),可能是老年代也可能是新生代并且区域不连续
实际上回收一个区域的时候仍然需要停止应用程序线程,但G1可以专注于回收那些大部分是垃圾的区域
清空大部分垃圾的区域+是G1的名字由来(garbage first)
G1 GC被称为并发回收器(concurrent collector)
因为标记老年代中不使用的对象和应用程序线程同时发生
G1并不是完全并发的,因为新生代的标记和压缩仍需要暂停所有应用程序线程
老年代的压缩也是在应用程序线程暂停期间完成的

G1的四个逻辑操作

1.新生代回收
2.后台并发标记周期
3.混合回收
4.必要的Full GC

请添加图片描述

并发模式失败 concurrent mode failure

G1 GC启动了一个标记周期,但是老年代在这个标记周期完成之前被填满了。
51.408: [GC concurrent-mark-start]
65.473: [Full GC 4095M->1395M(4096M), 6.1963770 secs]
[Times: user=7.87 sys=0.00, real=6.20 secs]
71.669: [GC concurrent-mark-abort]
[51.408][info][gc,marking ] GC(30) Concurrent Mark From Roots

[65.473][info][gc ] GC(32) Pause Full (G1 Evacuation Pause)
4095M->1305M(4096M) 60,196.377

[71.669s][info][gc,marking ] GC(30) Concurrent Mark From Roots 191ms
[71.669s][info][gc,marking ] GC(30) Concurrent Mark Abort

这种失败应该增加堆的大小,G1的后台处理必须更快,或者优化标记周期

晋升失败 promotion failure

G1完成了标记周期,已经开始执行Mixed GC以清理老年代区域
在还没有清理出足够的空间之前,有太多的对象从新生代晋升。导致老年代的空间还是用完了。
2226.224: [GC pause (mixed)
2226.440: [SoftReference, 0 refs, 0.0000060 secs]
2226.441: [WeakReference, 0 refs, 0.0000020 secs]
2226.441: [FinalReference, 0 refs, 0.0000010 secs]
2226.441: [PhantomReference, 0 refs, 0.0000010 secs]
2226.441: [JNI Weak Reference, 0.0000030 secs]
(to-space exhausted), 0.2390040 secs]

[Eden: 0.0B(400.0M)->0.0B(400.0M)
Survivors: 0.0B->0.0B Heap: 2006.4M(2048.0M)->2006.4M(2048.0M)]
[Times: user=1.70 sys=0.04, real=0.26 secs]
2226.510: [Full GC (Allocation Failure)
2227.519: [SoftReference, 4329 refs, 0.0005520 secs]
2227.520: [WeakReference, 12646 refs, 0.0010510 secs]
2227.521: [FinalReference, 7538 refs, 0.0005660 secs]
2227.521: [PhantomReference, 168 refs, 0.0000120 secs]
2227.521: [JNI Weak Reference, 0.0000020 secs]
2006M->907M(2048M), 4.1615450 secs]
[Times: user=6.76 sys=0.01, real=4.16 secs]

[2226.224 s][info][gc ] GC(26) Pause Young (Mixed)
(G1 Evacuation Pause)
2048m->2006 M(2048 M) 26.129 ms

[2226.510 s][info][gc,start ] GC(27) Pause Full (G1 Evacuation Pause)

混合回收需要执行的更快。

疏散失败 evacuation failure

当执行新生代回收,如果S空间和O空间没有足够空间容纳幸存对象
会出现一种特别的young gc
60.238: [GC pause (young) (to-space overflow), 0.41546900 secs]
[60.238s][info][gc,start ] GC(28) Pause Young (Concurrent Start)
(G1 Evacuation Pause)
[60.238s][info][gc,task ] GC(28) Using 4 workers of 4
for evacuation
[60.238s][info][gc ] GC(28) To-space exhausted

表明堆已经非常满或者碎片化严重,G1会进行补偿,但是结果可能更糟:JVM进而执行Full GC,这个时候暂停时间会更长

巨型对象分配失败(humongous allocation failure)

分配巨型对象的应用可能会触发另一种Full GC JDK 11日志如下
[3023.091s][info][gc,start ] GC(54) Pause Full (G1 Humongous Allocation)

元数据GC阈值 metadata GC threshold

元空间本质上是一个独立的堆,并且独立于主堆进行回收,并不是通过G1进行回收的
当需要元空间回收,G1会在主堆上执行Full GC

0.0535: [GC (Metadata GC Threshold) [PSYoungGen: 34113K->20388K(291328K)]
73838K->60121K(794112K), 0.0282912 secs]
[Times: user=0.05 sys=0.01, real=0.03 secs]
0.0566: [Full GC (Metadata GC Threshold) [PSYoungGen: 20388K->0K(291328K)]
[ParOldGen: 39732K->46178K(584192K)] 60121K->46178K(875520K),
[Metaspace: 59040K->59036K(1101824K)], 0.1121237 secs]
[Times: user=0.28 sys=0.01, real=0.11 secs]

元空间可以被回收,可以调整大小,而不必进行Full GC ON JDK 11 AND AFTER VERSION

优化G1

优化G1 GC的主要目标是确保没有因并发模式失败或疏散失败而产生FullGC
该技术也适用于优化频繁发生的Young GC必须等待根区域扫描完成的情况
在JDK8中优化FullGC的原因是单线程执行,比平时造成的停顿时间更长
JDK11 FullGC使用多线程执行,造成的停顿时间更短但是需要更多的时钟周期

优化可以尽量减少运行过程中的停顿次数
增加老年代大小
增加后台线程数量 linux commandline cat /proc/sys/kernel/threads-max
更频繁的执行G1 GC后台活动
增加Mixed GC周期工作量

主要通过一个参数进行优化
-XX:MaxGCPauseMillis=N 默认200毫秒
如果该标志的值减小,新生代大小将收缩以满足暂停时间目标,YGC会执行的更加频繁
如果满足停顿目标,减少MixedGC期间可以回收老年代,会提高并发收集失败的概率

优化G1后台线程

G1并发标记周期和应用程序的竞争出现是因为清理老年代的速度必须比晋升新对象的速度快
增加后台并发进程处理这个问题
G1 使用两组线程
1.通过-XX:ParallelGCThreads=N 设置
这个值会影响应用程序线程暂停阶段的线程数量
暂停阶段是新生代回收,混合回收,并发标记周期中应用程序必须暂停的阶段

2.-XX:ConcGCThread=N
影响并发标记的线程数量
ConcGCThreads = (ParallelGCThreads + 2) / 4

增加后台线程会缩短并发周期,让G1在Mixed GC过程中其他线程再次填满老年代的时候更容易的完成老年代的回收
CPU需要考虑到其中

优化G1 GC的运行频率

GC提前开始后台标记周期,也可以尽量减少FullGC
当堆达到-XX:InitiatingHeapOccupancyPercent=N设定的占用率,这个提前标记的周期才会开始
默认值是45,表示老年代占整个堆的比例
太大太小多不好,打了执行fullgc,小了执行后台gc更多

优化G1的Mixed GC周期

一个并发周期结束后,知道之前标记的所有老年代全部回收才会开始新的并发标记周期
让G1提前开始并发标记一个方法是在Mixed周期中处理更多的区域
Mixed工作量取决于三个因素
1.有多少区域被发现其中大部分是垃圾对象,目前没有办法可以直接影响这一点
2.G1处理区域是MixedGC周期的最大总次数
通过-XX:G1MixedGCCountTarget=N 默认8
减少可以解决晋升失败问题,代价是GC停顿时间更长–当并发完成开始mGC清理老年代的时候发现大量新对象填满老年代
过长的话会导致并发模式失败–并发周期未结束导致老年代再次被填满
3.GC可接受的最大停顿毫秒数(MaxGCPauseMillis)

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

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

相关文章

判断字符串是否是纯数字不包括符号(含符号显示False)isnumeric()和isdigit()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 判断字符串是否是纯数字 不包括符号(含符号显示False) isnumeric()和isdigit() [太阳]选择题 对于代码中当s为‘二十六’时isdigit()和isnumeric()输出的结果是? s …

机器学习笔记之近似推断(一)从深度学习角度认识推断

机器学习笔记之近似推断——从深度学习角度认识推断引言推断——基本介绍精确推断难的原因虽然能够表示,但计算代价太大无法直接表示引言 本节是一篇关于推断总结的博客,侧重点在于深度学习模型中的推断任务。 推断——基本介绍 推断(Inference\text{…

互联网医院建设|互联网医院远程问诊系统的功能有哪些?

互联网医院远程问诊系统已经得到了很好的应用,也解决了很多患者不方便复诊的问题,而且互联网医院功能也是根据不同的客户端有这不同的区分的,接下来带大家了解一下。 患者app端功能 预约挂号:支持门诊普通号预约、专家号定时抢约&…

Oracle SQL 性能分析原理与实战演练

作者 | JiekeXu来源 |公众号 JiekeXu DBA之路(ID: JiekeXu_IT)如需转载请联系授权 | (个人微信 ID:JiekeXu_DBA)大家好,我是 JiekeXu,很高兴又和大家见面了,今天和大家一起来看看 Oracle SQL 性能分析原理与实战演练,欢…

题解 # 二维矩阵最大矩形问题#

题目&#xff1a; 小明有一张N*M的方格纸&#xff0c;且部分小方格中涂了颜色&#xff0c;部分小方格还是空白。 给出N (2<Ns30)和M(2sMs30)的值&#xff0c;及每个小方格的状态(&#xff08;被涂了颜色小方格用数字1表示&#xff0c;空白小方格用数字0表示)&#xff1b; 请…

java泛型学习篇(一)

java泛型学习篇(一) 1 学习泛型前的传统思路 1.1 遍历集合中元素的方法 1.1.1 思路 ①用foreach进行遍历 ②把每个Object对象强转成所需类型 ③打印其值1.1.2 示例代码 import java.util.ArrayList; public class Generic01 {public static void main(String[] args) {lon…

机器学习:基于主成分分析(PCA)对数据降维

机器学习&#xff1a;基于主成分分析&#xff08;PCA&#xff09;对数据降维 作者&#xff1a;AOAIYI 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;AOAIYI首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可…

JavaWeb--HTTP

HTTP1 简介2 请求数据格式2.1 格式介绍3 响应数据格式3.1 格式介绍3.2 响应状态码3.2.1状态码大类3.2.2常见的响应状态码3.3 自定义服务器目标&#xff1a; 理解HTTP协议和HTTP请求与响应数据的格式 1 简介 HTTP概念 HyperText Transfer Protocol&#xff0c;超文本传输协议&a…

造成android UI卡顿的原因及解决方法

Android 系统每隔 16ms 会发出 VSYNC 信号重绘界面(Activity)。之所以是 16ms&#xff0c;是因为 Android 设定的刷新率是 60FPS(Frame Per Second)&#xff0c;也就是每秒 60 帧的刷新率&#xff0c;约合 16ms 刷新一次。如果UI线程的执行时间超过16ms&#xff0c;则会产生丢帧…

JavaSE08-运算符

文章目录一、算术运算符1.字符参与运算2.字符串参与 运算二、赋值运算符三、自增自减运算符四、比较运算符五、逻辑运算符六、三元运算符算术运算符、赋值运算符、自增自减运算符、比较运算符、逻辑运算符、三元运算符一、算术运算符 1.字符参与运算 char类型参与算术运算&…

Jmeter使用教程

目录一&#xff0c;简介二&#xff0c;Jmeter安装1&#xff0c;下载2&#xff0c;安装三&#xff0c;创建测试1&#xff0c;创建线程组2&#xff0c;创建HTTP请求默认值3&#xff0c;创建HTTP请求4&#xff0c;添加HTTP请求头5&#xff0c;添加断言6&#xff0c;添加查看结果树…

BoostSearcher搜索引擎项目

BoostSearcher搜索引擎项目 1.BoostSearcher这个项目是什么&#xff1f; 答&#xff1a;一个为Boost文档建立索引的站内搜索引擎&#xff0c;简单的说就是一个类似于csdn站内文档搜索框。 项目展示&#xff1a; gitee:https://gitee.com/zxlfx/boost-search-engine-project …

二叉树——堆

一&#xff0c;树的概念及结构 1.树 4.结点的度&#xff1a;一个节点含有子树的个数称为该结点的度&#xff1b;如&#xff1a;A 的度为6. 5.叶节点或终端节点&#xff1a;度为0的节点称为叶节点&#xff1b;如&#xff1a;B 6.非终端结点或分支节点&#xff1a;度部位0的结…

【华为OD机试模拟题】用 C++ 实现 - 吃火锅(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

【华为OD机试模拟题】用 C++ 实现 - 分积木(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

基于博客系统的测试用例

登陆界面博客预览页博客详情页博客编辑页

每日一题——L1-085 试试手气(15)

L1-085 试试手气 我们知道一个骰子有 6 个面&#xff0c;分别刻了 1 到 6 个点。下面给你 6 个骰子的初始状态&#xff0c;即它们朝上一面的点数&#xff0c;让你一把抓起摇出另一套结果。假设你摇骰子的手段特别精妙&#xff0c;每次摇出的结果都满足以下两个条件&#xff1a;…

【Java8】

1、接口中默认方法修饰为普通方法 在jdk8之前&#xff0c;interface之中可以定义变量和方法&#xff0c;变量必须是public、static、final的&#xff0c;方法必须是public、abstract的&#xff0c;由于这些修饰符都是默认的。 接口定义方法: public抽象方法需要子类实现 接口定…

TCP报文详解

目录 &#x1f407;今日良言:但尽全力,且让心安 &#x1f43c;一、TCP协议特点 &#x1f433;二、TCP协议段格式 &#x1f42f;三、TCP的10个核心机制 &#x1f41d;四、三次握手和四次挥手 &#x1f407;今日良言:但尽全力,且让心安 &#x1f43c;一、TCP协议特点 TCP :Tr…

OAuth 2.0 认证和攻击面

0x00 前提 最近在测试公司的 oauth 认证方面的问题&#xff0c;要再去熟悉一下这块&#xff0c;所以把这块写一下。 0x01 OAuth2.0 概念 OAuth是一个关于授权&#xff08;authorization&#xff09;的开放网络标准&#xff0c;目前是最常见最通用的一个授权协议。 什么地方…