第28讲 | 谈谈你的GC调优思路?
杨晓峰
该思维导图由 AI 生成,仅供参考
我发现,目前不少外部资料对 G1 的介绍大多还停留在 JDK 7 或更早期的实现,很多结论已经存在较大偏差,甚至一些过去的 GC 选项已经不再推荐使用。所以,今天我会选取新版 JDK 中的默认 G1 GC 作为重点进行详解,并且我会从调优实践的角度,分析典型场景和调优思路。下面我们一起来更新下这方面的知识。
今天我要问你的问题是,谈谈你的 GC 调优思路?
典型回答
谈到调优,这一定是针对特定场景、特定目的的事情, 对于 GC 调优来说,首先就需要清楚调优的目标是什么?从性能的角度看,通常关注三个方面,内存占用(footprint)、延时(latency)和吞吐量(throughput),大多数情况下调优会侧重于其中一个或者两个方面的目标,很少有情况可以兼顾三个不同的角度。当然,除了上面通常的三个方面,也可能需要考虑其他 GC 相关的场景,例如,OOM 也可能与不合理的 GC 相关参数有关;或者,应用启动速度方面的需求,GC 也会是个考虑的方面。
基本的调优思路可以总结为:
理解应用需求和问题,确定调优目标。假设,我们开发了一个应用服务,但发现偶尔会出现性能抖动,出现较长的服务停顿。评估用户可接受的响应时间和业务量,将目标简化为,希望 GC 暂停尽量控制在 200ms 以内,并且保证一定标准的吞吐量。
掌握 JVM 和 GC 的状态,定位具体的问题,确定真的有 GC 调优的必要。具体有很多方法,比如,通过 jstat 等工具查看 GC 等相关状态,可以开启 GC 日志,或者是利用操作系统提供的诊断工具等。例如,通过追踪 GC 日志,就可以查找是不是 GC 在特定时间发生了长时间的暂停,进而导致了应用响应不及时。
这里需要思考,选择的 GC 类型是否符合我们的应用特征,如果是,具体问题表现在哪里,是 Minor GC 过长,还是 Mixed GC 等出现异常停顿情况;如果不是,考虑切换到什么类型,如 CMS 和 G1 都是更侧重于低延迟的 GC 选项。
通过分析确定具体调整的参数或者软硬件配置。
验证是否达到调优目标,如果达到目标,即可以考虑结束调优;否则,重复完成分析、调整、验证这个过程。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
新版JDK中的默认G1 GC调优实践是本文的重点,深入探讨了G1 GC的调优思路和实践方法。文章强调了明确调优目标的重要性,包括内存占用、延时和吞吐量等方面的关注。此外,还介绍了G1 GC的内部结构和主要机制,以及其行为变化,如Humongous对象回收策略、字符串排重特性、类型卸载改进等。作者指出G1 GC调优相对简单、直观,因为可以直接设定暂停时间等目标,并且内部引入了各种智能的自适应机制。总的来说,本文为读者提供了GC调优的基本思路和手段,对于面试和实际工作都具有很大帮助。文章内容简洁明了,帮助读者更好地理解和应用JVM调优技术。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 核心技术面试精讲》,新⼈⾸单¥59
《Java 核心技术面试精讲》,新⼈⾸单¥59
立即购买
登录 后留言
全部留言(26)
- 最新
- 精选
- clz13415211,首先通过printgcdetail 查看fullgc频率以及时长 2,通过dump 查看内存中哪些对象多,这些可能是引起fullgc的原因,看是否能优化 3,如果堆大或者是生产环境,可以开起jmc 飞行一段时间,查看这期间的相关数据来订位问题
作者回复: 不错
2018-08-10266 - 又双叒叕是一年啊FullGc可通过Gc日志 或者添加fullgc前后堆dump 查看引起fullgc原因 CPU飙升可以看看jstack
作者回复: 不错思路,如果堆太大dump不现实呢;除了gc日志,还有没有其他工具?
2018-07-17420 - 半个西瓜老师,为什么 G1 对大堆非常友好。是因为运行机制也需要浪费一定的空间?
作者回复: 说来话长,简单说,除了尽量让更多GC工作并发进行,G1的内存区域是如棋盘一样的一个个region,非连续性内存划分以及一些设计,让相当一部分工作处理时间与堆大小不是很相关(当然也不是完全如此)
2019-01-1611 - 潇洒的毅小峰老师要快点更新啊感觉到26更不完,校招马上开始了呢,学的不亦乐乎
作者回复: 汗
2018-07-1111 - 又双叒叕是一年啊请问Remembered Set和cardtable关系是怎么样的?他们之间是如何协作一起完成g1 gc的?
作者回复: 我理解card table是remembered set的一种实现
2018-07-1636 - 蘅-XX:+PrintGCDetails -XX:+PrintGCDateStamps 这两个参数可用于CMS GC下吗?还是只能用于G1 GC?
作者回复: 当然可以,无关的;建议随手试验一下,顺道熟悉各种gc怎么启用
2018-08-154 - 三口先生jmap指令加不加live,分析是否是内存泄漏或者是请求的内存处理不过来等原因。
作者回复: 嗯,不过,加live会触发full gc吧
2018-07-113 - gwl遇到过线上系统卡顿的情况。业务反应系统登录不上,用top -p -h 和 jstack 发现是gc线程(数量和内核数一致且线程编号连续),排查内存中对象数量 (jmap -histo:live javaPid) 和 请求日志(elk或者log4j日志),发现是生成excel数据太多,一下子把老年代给撑爆了,导致疯狂的full gc。 后将excel生成类临时替换成 SXSSFWorkbook 就暂时没有出现过。2020-06-12110
- 蓝伽图1.查看full gc的频率和时间,以及回收前和回收后老年代回收了多少垃圾 2.如果回收的垃圾很多,比如 80%->20% 考虑业务是否有可以优化的地方,是否有同类型对象短时间大量过期,可以在内存高位执行 dump 然后等full gc 后再dump做对比 3.如果回收的垃圾比较少,执行dump,查看哪些对象占用了大部分空间,是不是发生了内存泄露,引用都被哪些对象持有,是否应该及时释放等。2020-06-019
- 程序员小跃前面的课程还行,接触了垃圾收集这几节课,感觉这课程真的很赞,把我很多自信都打败了,要好好学习2019-04-049
收起评论