JVM G1
G1 (Garbage-First) : 面向服务器的垃圾收集器
- 主要针对 : 多处理器 , 大容量内存的机器
- 即满足 GC 停顿时间要求 , 又有高吞吐量性能
特点:
- 并行与并发:用多个 CPU (CPU 或 CPU 核心) 来缩短 Stop-The-World 停顿时间
- 空间整合:全局基于标记-整理算法;局部基于标记-复制算法
- 可预测的停顿:建立可预测的停顿时间模型,能指定 GC 消耗时间 < N 毫秒
G1 划分 : 将 Java 堆分为多个大小相等的独立区域 (Region)
- 逻辑的新生代/ 老年代
- 每个 Region 大小都一样 [1M - 32M] , 当对象太大 , > Region 的 50% , 就放到 H 中
- 设置 Region :
-XX:G1HeapRegionSize=M
G1 收集器的步骤:
- 初始标记 ( Initial Marking ) : 标记 GC Roots 能关联的对象,并修改 TAMS 值,需暂停用户线程
- 并发标记 ( Concurrent Marking ) : 从 GC Roots 进行可达性分析,找出存活对象,与用户线程并发执行
- 最终标记 ( Final Marking ) : 修正并发标记时 , 因用户线程导致的变动数据,需暂停用户线程
- 筛选回收 (Live Data Counting and Evacuation ) : 对各 Region 的回收成本进行排序,根据用户设定 GC 停顿时间 , 制定回收计划
TLAB 流程 :
GCViewer 分析吞吐量和响应时间
吞吐量 暂停时间 GC 数
Throughput Min Pause Max Pause Avg Pause GC count
99.16% 0.00016s 0.0137s 0.00559s 12
参数 :
# 开启 G1 垃圾收集器
-XX: +UseG1GC
# 设置每个 Region 大小,是 2 的幂次,1MB-32MB 之间
-XX: G1HeapReginSize
# 最大停顿时间
# 在 100ms - 200ms 左右
# 原因 : 太小 , 会跟不上垃圾生成速度 , 导致 Full GC
-XX:MaxGCPauseMillis
# 并行 GC 工作的线程数
-XX:ParallelGCThread
# 并发标记的线程数
# 太高 , 会导致转移失败
# 太低 , 导致标记频繁
-XX:ConcGCThreads
# 默认 45% : GC堆占用达到多少时, 开始垃圾收集
-XX:InitiatingHeapOcccupancyPercent
# 调整内存
# G1 会自动调整新生代和老年代的大小
-XX:MetaspaceSize=100M
-Xms300M
-Xmx300M
# MixedGC
-XX:InitiatingHeapOccupancyPercent
-XX:G1MixedGCLiveThresholdPercent
-XX:G1MixedGCCountTarger
-XX:G1OldCSetRegionThresholdPercent