前言
承接上文,继续总结
一、G1回收器
- G1垃圾收集器将整个JVM内存分为多个大小相等的region,年轻代和老年代逻辑分区
- G1是java9以后的默认垃圾回收器
- G1在整体上使用标记整理算法,局部使用复制算法
- G1的每个region大小在1-32M之间,可以通过-XX: G1HeapRegionSize=n指定区大小
- 总的Region个数最大可以存2048个,即heap最大能够达到32M*2048=64G
- 0.5<obj<1,那么放到old区,old标记为H
1<obj<n,连续的n个regin作为H
概念
-
rset
每个region都有一个叫rset的小区,它代表了其他region引用了当前region对象的记录 -
cset
本次GC需要清理的Region集合
mixGC过程
- 初始标记(标记出GC root对象,以及GCroot所在的Region(RootRegion)
- Root Region Scanning(扫描整个old的Region)
- 并发标记(并发追溯标记,进行GCRootTracing的过程)
- 最终标记(修正并发标记期间,因程序运行导致标记发生变化的那一部分对象)
- 清理回收: 根据时间来进行价值最大化的回收,重置rset
G1相关参数配置
-XX:+UserG1GC:使用G1垃圾回收器
-XX:MaxGCPauseMillis=n:最大GC停顿时间,毫秒值
-XX:InitatingHeapOccapancyPercent=n:当堆空间占用到n兆时触发GC
-XX:ConcGCThreads=n:并发GC使用的线程数
-XX:G1ReserverPercent=n 设置作为空闲空间的预留内存百分比(10%)
二、 ZGC回收器
颜色指针
Object o = new Object(),其中o引用的信息存储如上图,中间Finalizable到Marked0标记颜色指针
读屏障
new Object()存在一个个region中,o指向其地址时,如果发生GC,导致new Object()地址发生变化,需要o正确指向。 在读取o引用时,加上一个读屏障,当为bad color时,等o地址正确时,在指向正确读取
GC流程
- 并发标记(如果是活跃对象,o引用中标记为mark0或mark1,如果不是活跃对象,则标记为remapped)
- 并发预备重分配(扫描所有region区,标记出relocate set区域)
- 并发重分配(将其中活得对象通过转移移动到一个专门维护转移的表(forward table),释放旧的引用关系,同时进行自愈)
- 并发重映射(修正o的新老地址引用)
三、调优
常用工具
-
jps
主要查看虚拟机的相关参数配置 -
jstat
类加载,内存,垃圾收集,jit编译信息 -
jinfo
实时调整和查看虚拟机参数 -
jmap
侧重查看内存信息 -
jhat
分析java堆信息,以html的形式显示出来,支持对象查询语言 -
jstack
线程堆栈信息 -
Arthas
目的
- 减小响应时间
- 提高吞吐量
常用参数
-XX:+UseXXXGC
-Xms和-Xmx
-XX:NewRatio
-XX:SurviorRatio
-XX:+UserAdaptiveSizePolicy
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath
-XX:MaxTenuringThreshold
-Xloggc:/xxx/logs/xxx-gc-%t.log
-XX:+UserGCLogFileRotation
-XX:NumberOfGCLogFiles = 5
-XX:GCLogFileSize=20M
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
步骤
- 熟悉业务场景
- 选择合理的垃圾收集器
- 计算内存需求
- 设定年轻代老年代大小
- 设置日志参数
- 压力测试
- 分析日志
- 调整参数