JVM GC
2023-7-12
| 2025-3-13
字数 292阅读时长 1 分钟
type
status
date
slug
summary
tags
category
icon
password
AI summary
Last edited time
Mar 13, 2025 08:33 AM

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

吞吐率(Throughput)公式

= 业务计算时长
= GC时长
= 吞吐率
为了提高吞吐率 ,我们希望:
  • 减少 GC 时间 ,让应用执行更多任务。
  • 减少 GC 触发次数,即 GC 发生得越少越好。
但这样会带来一个问题:如果 GC 触发得少,意味着垃圾会在堆中积累得更多,每次 GC 需要回收的对象会更多,导致单次 GC 停顿时间(Latency)更长。

延迟(Latency)公式

= 一次GC停顿的时间
= 存活对象数量
= 堆大小
GC 停顿时间(Latency)与存活对象数量 和堆大小 成正比
 

几种垃圾回收期的对比

垃圾回收算法

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