云时代的 JVM 原理与实战
康杨
京东资深架构师
3111 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 39 讲
云时代的 JVM 原理与实战
15
15
1.0x
00:00/00:00
登录|注册

15|垃圾回收器:为什么G1被叫做GC中的王者?

你好,我是康杨。
今天我们继续聊 GC 的话题。我们将选择一个具体的垃圾回收器进行深入的分析,这个选定的主角就是 G1,也被称为 Garbage First。

为什么选择 G1?

在当前的生产环境中,JDK 8 仍是被广泛采用的版本,在 JDK 8 时代,CMS 和 G1 这两种垃圾回收器不分伯仲,在不同业务场景中,各有优劣。而造成这种现象的原因是我们正处在一个时代的转型期,也就是从物理机到虚拟机再到云时代的转型期,目前正是多代并存的历史节点,也就是在实际生产环境中既有使用传统的物理服务器的业务,也有使用虚拟机的业务,更有已经大规模迁移到云平台的业务。
底层基础设施变迁,对我们如何使用 JVM 也在产生着潜移默化的影响。而 New Relic 最新发布的 2023 年的报告给我们指明了一个方向。
报告中指出在 JDK 11 及以上的版本中,G1 一骑绝尘,使用率占比达到 65% 。所以在这个 CMS 垃圾收集器逐步淡出历史舞台,而 ZGC 还未完全成熟的阶段,G1 垃圾收器注定将在未来的一段时间内扛起主流垃圾收集器的大旗,成为兼顾延迟与吞吐的最佳选择。而现实中,在 JDK 11 逐渐登上历史舞台的背景下,越来越多的系统,通过升级到 G1 以实现性能的提升。这也是我们今天选择 G1 作为介绍对象的原因。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

G1垃圾回收器是当前主流垃圾收集器的首选,其独特的特点和性能优势备受推崇。G1以Region作为最小的内存分配和回收单元,通过全局并发标记机制和预期停顿模型,实现了对内存回收的精细化管理,具备低延迟和可预测的能力。文章介绍了G1的JVM参数配置,包括目标停顿时间、并行GC线程数、内存占用阈值等,以及动态调整和优化G1HeapRegionSize值的方法。此外,文章还掏出了G1的特性和内存管理方式,以及在实际应用中需要注意的方面,如合适的堆大小、目标停顿时间、线程数和Region大小的选择。总之,G1垃圾回收器在解决空间碎片化问题、提高GC效率方面具有显著优势,但在使用和配置时需要综合考虑实际业务特点和压测数据,以及合理调优和慎重选择。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云时代的 JVM 原理与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(4)

  • 最新
  • 精选
  • peter
    请教老师两个问题: Q1:预测,这件事情是JVM创建的线程来完成吗?预测会导致停顿吗?一般会停顿多久? Q2:“ConcGCThreads”是“并发”吧。文中说“这个参数设置并行 GC 的线程数”,感觉这个是“并发”,不是并行。“ParallelGCThreads”这个参数是“并行”吧。“ConcGCThreads”和“ParallelGCThreads”会同时存在吗?

    作者回复: A1:预测是由JVM创建的线程来完成的,但这种情况下,JVM并不会暂停应用线程。因此,预测并不会导致停顿。预测操作主要是为了提高系统的性能,避免在垃圾回收过程中出现长时间的停顿。 A2: “ConcGCThreads”参数是用来设置并发标记的线程数,而“ParallelGCThreads”参数是用来设置并行垃圾回收的线程数。这两个参数是可以同时存在的,因为它们服务于不同的垃圾回收阶段。"ConcGCThreads"和"ParallelGCThreads"参数可以同时调整,以在JVM中获取最优的垃圾收集性能。

    2023-09-24归属地:北京
    1
  • quietwater
    老师,G1 创建约 2048 个 Region。G1Region的数量是固定不变的,还是根据堆的大小和Region的大小,计算出来的?如果是2G的堆内存每个Region的大小1M,会有2048个Region,如果是4G堆内存,Region的大小是1M,会有4096个Region。

    作者回复: 是的,G1垃圾收集器的Region数量是在虚拟机启动时计算得到的,这个数量主要取决于堆内存的大小和每个Region的大小。

    2023-09-22归属地:北京
    2
  • 浩仔是程序员
    老师,您好,对于普通的web应用,最大堆内存在2G-4G,您建议是用CMS还是G1呢?对于G1,看起来还是额外的内存空间维护记忆集和卡表,对于这种堆大小不是很大的应用场景,是不是CMS更有优势
    2023-10-07归属地:广东
    1
    1
  • 静心
    这一节讲得感觉还不错,收获挺多的,一些重点基本都讲到了。
    2024-02-04归属地:山西
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部