JVM GC

478 字
2 分钟
JVM GC

为什么 GC 中吞吐率(Throughput)和延迟(Latency)相互对立#

吞吐率(Throughput)公式#

TworkT_{work} = 业务计算时长

TgcT_{gc} = GC时长

η\eta = 吞吐率

η=TworkTwork+Tgc\eta = \frac{T_{work}}{T_{work} + T_{gc}}

为了提高吞吐率 η\eta,我们希望:

  • 减少 GC 时间 TgcT_{gc},让应用执行更多任务。
  • 减少 GC 触发次数,即 GC 发生得越少越好。

但这样会带来一个问题:如果 GC 触发得少,意味着垃圾会在堆中积累得更多,每次 GC 需要回收的对象会更多,导致单次 GC 停顿时间(Latency)更长。

延迟(Latency)公式#

TpauseT_{pause} = 一次GC停顿的时间

SS = 存活对象数量

HH = 堆大小

GC 停顿时间(Latency)与存活对象数量 SS 和堆大小 HH 成正比

TpauseS+HT_{pause} \propto S + H

几种垃圾回收期的对比#

垃圾回收算法#

  • 复制算法
    • 简单高效
    • 内存利用率低
  • 标记-清除
    • 简单
    • 内存空间上碎片化
  • 标记-整理
    • 无碎片
    • 实现复杂
GC回收期回收区域算法线程工作模式适用场景
SerialYoung复制单线程独占客户端应用或资源受限的环境
ParNew(Serial多线程版本)Young复制多线程独占与CMS结合使用
Parallel ScavengeYoung复制多线程独占吞吐量优先
Serial OldOld标记-整理单线程独占
CMS(已废弃)Old标记-清除多线程并发对响应时间敏感的应用,如Web服务器
Parallel OldOld标记-整理多线程独占与 Parallel Scavenge 结合使用,吞吐量优先
G1Young + OldYoung: 复制
Old: 整理+复制
多线程并发大内存、多核处理器,适用于需要低延迟和高吞吐量的应用
ZGCYoung + Old标记-整理多线程并发需要极低延迟的应用,如实时系统
ShenandoahYoung + Old标记-整理多线程并发需要低延迟的应用

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

JVM GC
https://blog.sephy.top/posts/jvm-gc/
作者
虾米
发布于
2023-07-12
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
虾米
coder
分类
标签
站点统计
文章
61
分类
4
标签
52
总字数
64,663
运行时长
0
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.13.9
文章许可
CC BY-NC-SA 4.0