JVM GC
478 字
2 分钟
JVM GC
为什么 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 | 标记-整理 | 多线程 | 并发 | 需要低延迟的应用 |
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章智能推荐
1
JMM
技术分享Java 内存模型详解。包含主内存/工作内存、happens-before、内存屏障、volatile 原理等。
2
Mybatis 基础字段自动维护
技术分享感觉 mybatis plus 中的自动填充机制不够灵活优雅, 所以有了这篇文章
3
Playwright 使用心得
2025-08-08
4
Spring Cloud Gateway 流量复制
Spring Cloud Gateway 流量复制方案。包含复制场景、实现方式、注意事项等。
5
Drone CI 小试
技术分享每次推送代码到自建的 gitea 之后, 都要手动去 linux 服务器上执行部署脚本, 虽然这个操作一共也就几步(拉取最新代码 → 打包构建 → 生成 docker 镜像 → docker compose 运行), 之前就听说过 Drone CI, 这里假期刚好可以折腾小试一下.
随机文章随机推荐













