Java 核心技术面试精讲
杨晓峰
前 Oracle 首席工程师
125942 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
Java 核心技术面试精讲
15
15
1.0x
00:00/00:00
登录|注册

第28讲 | 谈谈你的GC调优思路?

通用实践
掌握GC调优信息收集途径
升级到较新的JDK版本
Full GC并行进行
并发标记启动时机动态调整
类型卸载改进
字符串排重特性
Humongous对象回收策略改进
G1内部运行状态流转变化
GC算法
内存区域的概念
验证是否达到调优目标
确定调整的参数或软硬件配置
考虑GC类型是否符合应用特征
掌握JVM和GC的状态
确定调优目标
吞吐量
延时
内存占用
调优建议
G1行为变化
G1 GC内部结构和机制
基本调优思路
目标
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
立即购买
登录 后留言

全部留言(26)

  • 最新
  • 精选
  • clz1341521
    1,首先通过printgcdetail 查看fullgc频率以及时长 2,通过dump 查看内存中哪些对象多,这些可能是引起fullgc的原因,看是否能优化 3,如果堆大或者是生产环境,可以开起jmc 飞行一段时间,查看这期间的相关数据来订位问题

    作者回复: 不错

    2018-08-10
    2
    66
  • 又双叒叕是一年啊
    FullGc可通过Gc日志 或者添加fullgc前后堆dump 查看引起fullgc原因 CPU飙升可以看看jstack

    作者回复: 不错思路,如果堆太大dump不现实呢;除了gc日志,还有没有其他工具?

    2018-07-17
    4
    20
  • 半个西瓜
    老师,为什么 G1 对大堆非常友好。是因为运行机制也需要浪费一定的空间?

    作者回复: 说来话长,简单说,除了尽量让更多GC工作并发进行,G1的内存区域是如棋盘一样的一个个region,非连续性内存划分以及一些设计,让相当一部分工作处理时间与堆大小不是很相关(当然也不是完全如此)

    2019-01-16
    11
  • 潇洒的毅小峰
    老师要快点更新啊感觉到26更不完,校招马上开始了呢,学的不亦乐乎

    作者回复: 汗

    2018-07-11
    11
  • 又双叒叕是一年啊
    请问Remembered Set和cardtable关系是怎么样的?他们之间是如何协作一起完成g1 gc的?

    作者回复: 我理解card table是remembered set的一种实现

    2018-07-16
    3
    6
  • -XX:+PrintGCDetails -XX:+PrintGCDateStamps 这两个参数可用于CMS GC下吗?还是只能用于G1 GC?

    作者回复: 当然可以,无关的;建议随手试验一下,顺道熟悉各种gc怎么启用

    2018-08-15
    4
  • 三口先生
    jmap指令加不加live,分析是否是内存泄漏或者是请求的内存处理不过来等原因。

    作者回复: 嗯,不过,加live会触发full gc吧

    2018-07-11
    3
  • gwl
    遇到过线上系统卡顿的情况。业务反应系统登录不上,用top -p -h 和 jstack 发现是gc线程(数量和内核数一致且线程编号连续),排查内存中对象数量 (jmap -histo:live javaPid) 和 请求日志(elk或者log4j日志),发现是生成excel数据太多,一下子把老年代给撑爆了,导致疯狂的full gc。 后将excel生成类临时替换成 SXSSFWorkbook 就暂时没有出现过。
    2020-06-12
    1
    10
  • 蓝伽图
    1.查看full gc的频率和时间,以及回收前和回收后老年代回收了多少垃圾 2.如果回收的垃圾很多,比如 80%->20% 考虑业务是否有可以优化的地方,是否有同类型对象短时间大量过期,可以在内存高位执行 dump 然后等full gc 后再dump做对比 3.如果回收的垃圾比较少,执行dump,查看哪些对象占用了大部分空间,是不是发生了内存泄露,引用都被哪些对象持有,是否应该及时释放等。
    2020-06-01
    9
  • 程序员小跃
    前面的课程还行,接触了垃圾收集这几节课,感觉这课程真的很赞,把我很多自信都打败了,要好好学习
    2019-04-04
    9
收起评论
显示
设置
留言
26
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部