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

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

你好,我是朱晔。
上一篇加餐中,我们介绍了使用 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 业务开发常见错误 100 例》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(16)

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

    作者回复: 是的

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

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

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

    作者回复: :)

    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

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

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

    6
  • Geek_3b1096
    越觉得自己菜谢谢老师

    作者回复: 不客气

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

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

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

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

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