当前位置:网站首页>JVM 垃圾回收器之Garbage First
JVM 垃圾回收器之Garbage First
2022-07-06 09:33:00 【TiggerRun】
垃圾回收器
笔记导航
Garbage First GC
记录JVM学习笔记,理解可能存在偏差,望指正。
G1 垃圾收集器
关键词:Region、分区算法、延时可控、停顿预测模型、并行、并发、RSet、MixedGC
G1希望实现的目标:延迟可控的情况下尽可能的提高吞吐量
概述
- G1是一个
并行、并发
兼具的垃圾回收器,将内存分为很多不相干的区域(Region
物理上是不连续的) - G1有计划的避免在整个堆中进行GC,
每次根据允许的收集时间,优先收集最大价值的Region
- G1面对服务端应用,主要正对配备
多核CPU及大容量内存的机器
- G1 在JDK7中正式启用,JDK9后的默认垃圾回收器
内存分配策略
在G1垃圾回收器中同时用到了两种内存分配策略
- 指针碰撞:在一个Region中通过指针碰撞为新的对象分配内存
- 空闲列表:维护一个LinkedList来保存空闲的Region
保留分代收集思想
- G1仍然保留分代思想,还是将堆内存分为
新生代
、老年代
- 在内存分布上不再固定,G1将内存划分为多个
Region
- Region可以
动态
扮演不同的角色(新生代
、老年代
、Humongous
),大小超过一个Region的对象会存放在连续的HumongousRegion中,通常情况下会当作老年代处理。
空间整合
- G1有碎片整理,G1的内存回收以Region为单位,Region之间是
复制算法
,整体上可以看作是标记压缩算法。
停顿预测统计模型
G1通过衰减均值
对每个Region回收的时耗、垃圾数量和其他可测量的成本进行计算获取一系列的统计值。衰减均值可以表示最近的
平均状态,通过统计值来预测现在开始垃圾回收,哪一个Region会有更好的效益。维护一个优先列表
,因此命名为Garbage First
回收效益第一的Region。
跨区引用的解决方案
卡表
卡表(CardTable),由内存卡片(Card)构成
每一个Region默认按照512kb划分为很多卡片构成一张卡表,RSet记录的是卡的位置而不是对象本身
记忆集
记忆集(Remember Set,R Set),是为了解决跨Region的对象引用,在YoungGC时,如果对象被老年代的对象引用,则不应该被清除,但由于G1收集器的堆内存是分区的,需要遍历整个堆才能得到对象的引用关系,在YGC时遍历整个堆内存是不合理的。
每一个Region都分配了一个RSet,存储了对象的引用关系(Region1
的Region1Card_x
引用了Region2
的Region2Card_y
),有这样的引用关系后,可达性分析就只需要获得GC Roots,不需要遍历整个堆空间
回收阶段详解
YOUNG GC 阶段
- 根扫描(初始化标记)
- 更新脏卡队列(可能代码执行过程中修改了卡的引用关系),更新Rset(同步),这样保证了得到的Rset的引用关系是最新的
- 处理Rset,识别被老年代引用的Eden区、S区中的对象,即告诉垃圾收集器这个对象不是垃圾
复制对象
,Eden区存活的对象会被复制到S区的空闲区域,年龄自增,达到阈值的进入老年区,部分对象会之间晋升到老年区(由于是复制算法,G1实现了碎片整理)
- 处理引用,由于复制对象造成Region发生变化,所以要更新Rset
并发标记阶段
标记垃圾的过程是比较耗时的因为需要遍历引用关系,但这个过程是并发执行的,并不是STW,GC线程和用户线程同时工作。
- 并发标记:如果发现Region中都是垃圾会直接进行
实时回收
而不需要等待下一个阶段。 - 再次标记(
STW
):由于并发标记的过程是并发的,用户线程可能修改了引用关系,所以需要对标记进行修正。 - 独占清理(
STW
):计算每个Region的回收比例,并且进行排序,为后续阶段做准备 - 并发清理:识别并完全清理空闲的Region
MIXED GC 阶段
- 这个阶段中,回收率100%的Region已经被实时清除,只剩下含有部分垃圾的Region
- 当堆内存占用达到一定的阈值
-XX:G1MixedGCLiveThresholdPercent
后,自动进行混合回收 - 区分MixedGC和FullGC,MixedGC只回收部分老年代
- 老年代垃圾内存分段将分8次
-XX:G1MixedGCCountTarget
进行回收,回收比例高的分段优先回收 - 当然也不一定执行8次,因为
-XX:G1HeapWastePercent
指定了允许的浪费空间比例
G1存在的缺陷
- 额外的内存空间
- 额外的执行负载
G1的适用场景
- 首先是服务端应用、大内存、多CPU处理器
- 应用要求GC是低延迟的,停顿时间可控的
- 可以用来替换CMS
注意点
停顿时间不是越短越好
,如果停顿时间过短,可能导致每次只能处理少数Region,对象生成的速度大于垃圾处理的速度,最终将导致FullGC
常用参数
参数名称 | 默认值 | 作用 |
---|---|---|
-XX:+UseG1GC | JDK9后版本默认使用G1 | 启动G1垃圾回收器 |
-XX:G1HeapRegionSize | 1m | 设置Region的大小(1m~32m 必须是2的幂次) |
-XX:MaxGCPauseMillis | 200ms | 设置最大停顿时间 |
-XX:ParallelGCThreads | 8 | 并行线程数 |
-XX:ConcGCThreads | 2 | 并发线程数,推荐 1/4 并行线程 |
-XX:InitiatingHeapOccupancyPercent | 45% | 设置触发并发标记的对内存占用阈值 |
-XX:G1MixedGCCountTarget | 8 | MixedGC阶段分几次完成 |
-XX:G1MixedGCLiveThresholdPercent | 65% | 设置触发MixedGC的堆内存占用阈值 |
-XX:G1HeapWastePercent | 10% | 设置允许的堆内存浪费 |
优化建议
年轻代大小
使用G1垃圾收集器时,不要通过Xmn
、-XX:NewRatio
设置固定的年轻代大小,而是交给G1垃圾收集器动态设置,否则将覆盖目标停顿时间。停顿时间设置不要过小
边栏推荐
- 登陆验证koa-passport中间件的简单使用
- ByteDance technical Interviewer: what kind of candidate do I want to pick most
- 在 vi 编辑器中的命令模式下,删除当前光标处的字符使用 __ 命 令。
- Only learning C can live up to expectations top2 P1 variable
- Activiti directory (IV) inquiry agency / done, approved
- 吴军三部曲见识(七) 商业的本质
- Flink源码解读(三):ExecutionGraph源码解读
- 汇编语言段定义
- Install docker under windows10 (through Oracle VM VirtualBox)
- Fdog series (V): use QT to imitate QQ to realize login interface to main interface, function chapter.
猜你喜欢
The "advertising maniacs" in this group of programmers turned Tiktok advertisements into ar games
Install docker under windows10 (through Oracle VM VirtualBox)
Shell_ 00_ First meeting shell
High performance mysql (Third Edition) notes
Instructions for Redux
Flink 解析(四):恢复机制
TCP的三次握手和四次挥手
Yao BanZhi and his team came together, and the competition experts gathered together. What fairy programming competition is this?
MySQL数字函数
Assembly language addressing mode
随机推荐
Use of mongodb in node
The daemon thread starts redis and modifies the configuration file
Flink源码解读(二):JobGraph源码解读
Coursera cannot play video
MySQL string function
After idea installs the plug-in, restart the plug-in and disappear
yum install xxx报错
Conception du système de thermomètre numérique DS18B20
Shell_ 03_ environment variable
MySQL数字函数
搭建flutter环境入坑集合
Activiti目录(四)查询代办/已办、审核
Take you hand-in-hand to do intensive learning experiments -- knock the level in detail
Ce n'est qu'en apprenant que c est à la hauteur des attentes Top5 s1e8 | s1e9: caractères et chaînes & opérateurs arithmétiques
Learn the wisdom of investment Masters
唯有学C不负众望 TOP2 p1变量
Notes on how the network is connected
这群程序员中的「广告狂人」,把抖音广告做成了AR游戏
Go language uses the thrift protocol to realize the client and service end reports not enough arguments in call to oprot Writemessagebegin error resolution
SQL调优小记