Java 业务开发常见错误 100 例
朱晔
贝壳金服资深架构师
52944 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
代码篇 (23讲)
Java 业务开发常见错误 100 例
15
15
1.0x
00:00/00:00
登录|注册

35 | 加餐5:分析定位Java问题,一定要用好这些工具(二)

ognl命令
watch命令
jad命令
thread命令
dashboard命令
生产代码热修复
一键反编译类查看源码
一键定位问题
查看线程栈
查看对象属性
直方图功能
支配树功能
JDK参数设置
堆现场全貌和线程栈信息
平时工作中使用的工具
Arthas的热修复功能
使用MAT分析堆转储定位问题
模拟两种可能的OOM情况
使用正确的工具、方法分析问题
案例分享
使用Arthas定位CPU高问题
Arthas工具
使用Eclipse的Memory Analyzer(MAT)
堆转储
思考与讨论
重点回顾
使用Arthas分析高CPU问题
使用MAT分析OOM问题
分析定位Java问题,一定要用好这些工具

该思维导图由 AI 生成,仅供参考

你好,我是朱晔。
上一篇加餐中,我们介绍了使用 JDK 内置的一些工具、网络抓包工具 Wireshark 去分析、定位 Java 程序的问题。很多同学看完这一讲,留言反馈说是“打开了一片新天地,之前没有关注过 JVM”“利用 JVM 工具发现了生产 OOM 的原因”。
其实,工具正是帮助我们深入到框架和组件内部,了解其运作方式和原理的重要抓手。所以,我们一定要用好它们。
今天,我继续和你介绍如何使用 JVM 堆转储的工具 MAT 来分析 OOM 问题,以及如何使用全能的故障诊断工具 Arthas 来分析、定位高 CPU 问题。

使用 MAT 分析 OOM 问题

对于排查 OOM 问题、分析程序堆内存使用情况,最好的方式就是分析堆转储。
堆转储,包含了堆现场全貌和线程栈信息(Java 6 Update 14 开始包含)。我们在上一篇加餐中看到,使用 jstat 等工具虽然可以观察堆内存使用情况的变化,但是对程序内到底有多少对象、哪些是大对象还一无所知,也就是说只能看到问题但无法定位问题。而堆转储,就好似得到了病人在某个瞬间的全景核磁影像,可以拿着慢慢分析。
Java 的 OutOfMemoryError 是比较严重的问题,需要分析出根因,所以对生产应用一般都会这样设置 JVM 参数,方便发生 OOM 时进行堆转储:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何使用Java工具来分析和定位Java程序中的问题。首先介绍了使用JVM堆转储工具MAT来分析OOM(内存溢出)问题,以及如何使用故障诊断工具Arthas来分析和定位高CPU问题。对于OOM问题,作者建议使用MAT工具进行分析,通过支配树和直方图功能来查看消耗内存最大的类型,定位内存泄露的原因,并配合查看对象属性的功能来帮助理清程序逻辑和参数。作者还详细介绍了使用MAT工具的具体操作步骤,包括查看对象引用链、查看线程栈等功能。通过实际案例分析,读者可以了解如何从堆转储中还原出程序的真实代码,定位程序中的内存问题。整体而言,本文通过具体的案例和操作步骤,帮助读者深入理解了如何利用Java工具来分析和解决程序中的问题。 Arthas是一款强大的Java诊断工具,具有人性化的界面和功能强大的特点。通过实际案例,文章展示了如何使用Arthas来定位高CPU问题,包括使用dashboard、thread、jad、watch、ognl等命令来分析问题。通过这些命令,读者可以快速定位问题,反编译相关代码,观察方法入参,并通过ognl命令来运行表达式,直接查询类的字段。文章还分享了一个开发同学使用Arthas定位OOM问题的案例,强调了使用正确的工具和方法可以快速定位问题根因。最后,文章提出了一些思考与讨论的问题,引发读者对于工具使用的思考和交流。 总的来说,本文通过介绍MAT和Arthas工具的使用方法和实际案例,帮助读者了解如何利用这些工具来分析和解决Java程序中的内存和CPU问题,为读者提供了一种快速定位和解决Java程序问题的方法。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 业务开发常见错误 100 例》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(16)

  • 最新
  • 精选
  • QQ怪
    arthas的确很强,线上排查还真的爽,点赞

    作者回复: 是的

    2020-04-30
    14
  • 何嘉杰_JessyHo
    老师咨询一下,生产应用都打包成 docker 镜像跑在 k8s 集群中,镜像里面往往只有 jre ,jdk的工具乃至很多 linux 的命令都没有。这种情况下,如果出了异常,要怎样排查问题呢

    作者回复: 可以把jdk的工具复制到镜像使用,网上有很多文章介绍如何操作,此外可以利用监控工具排查问题或者转存堆,不一定非得使用jdk工具

    2020-05-04
    11
  • Demon.Lee
    F**k, F**k, 太 powerful了,对于我这种小白来说,真的手把手教了,赶紧practice。哎,我工作10年了,以前写写C,最近3年才写java,真的越学越发现自己啥也不会,追赶呀,追赶!老师们,辛苦了。

    作者回复: :)

    2020-04-30
    10
  • devin.ou
    MAT发现Unreachable Objects Histogram的char[]占了3.6G, byte[]占了2.2G. 而且运行一段时间后, 这个Unreachable空间还会增长直接监控报警后手工重启应用. 这个与配置 -Xmx10g -Xms3g, 导致了GC不回收吗? 是否要将-Xms改少到1G, 才会GC回收. 或者有别的优化方式.

    作者回复: 1、xmx和xms建议一致 2、gc启动时机是有参数配置的,内存不占用到一定的比例不会启动gc,比如cms的XX:CMSInitiatingOccupancyFraction,g1的XX:InitiatingHeapOccupancyPercent

    2020-05-12
    2
    7
  • coffee
    老师,请教您一个问题,如果hprof堆转储文件过大,mat打不开,用什么办法来定位oom问题?

    作者回复: mat可以设堆大小

    2020-04-30
    6
  • Geek_3b1096
    越觉得自己菜谢谢老师

    作者回复: 不客气

    2020-05-11
    3
  • NARUTO
    metaspace oom原因比较好定位,就是定位到根本的代码行比较困难

    作者回复: 参考 https://blog.gceasy.io/2022/08/23/inspect-the-contents-of-the-java-metaspace-region/ 定位到行是困难的,但至少可以定位到哪个类在重复加载

    2023-10-14归属地:湖南
  • 飞鱼
    老师,请问下,在线程池中使用threadlocal,作为二级缓存,但是有地方在使用后未及时清理该线程变量,导致内存泄露,用mat分析了下,但是没有详细引用链路,像您例子中那样可以看到具体是由那个类引发的,能帮忙给点意见吗?谢谢

    作者回复: 我回头测试一下,https://github.com/JosephZhu1983/java-common-mistakes/blob/master/src/main/java/org/geekbang/time/commonmistakes/concurrenttool/threadlocal/Jietu20200710-113641.jpg 可以看到

    2020-07-10
  • vivi
    Arthas的代码热替换功能确实很香 但是还是有两个小问题 一个是没有权限控制 任何人都可以进行代码热替换操作 另一个就是代码热替换如果改错了 问题就不太好排查了
    2020-04-30
    14
  • 程序员小跃
    以前用Eclipse 开发Android App的时候,遇到一些OOM,会跟着师傅一起用 MAT 排查,从不会用到使用,到一直使用一直爽的状态,排查了好多疑难杂症,真的很棒。老师讲的这个,又给我复习了一遍。 Arthas 真的强大,看评论去就懂了,所以感谢老师提供一个简短的教程,干就完事了
    2020-10-31
    3
收起评论
显示
设置
留言
16
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部