美文网首页
Java大堆栈分析的经验

Java大堆栈分析的经验

作者: 西5d | 来源:发表于2021-07-14 10:35 被阅读0次

背景

相信有不少人遇到过线上业务出现问题,为排查导出线上业务堆栈,但是最后发现导出的堆栈文件过大,少则2-3G,多则10GB大小,无法直接分析,这时候有点束手无策。本期的文章,就以如上描述的场景为例子,简单介绍下对于超大的堆栈,如何进行堆栈分析,获得
我们需要的现场数据。

分析

导出堆栈

添加启动参数,在内存溢出时导出

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=xxx.hprof

手动导出

jmap -dump:live,format=b,file=xxx.hprof <PID> 

分析堆栈

常见的分析工具有如下的几种:

  1. jvisualvm
    这个是JDK自带的工具,可以通过图形化界面查看,可以在jdk的bin目录下找到。但是这个工具只适合较小堆栈分析。
  2. jhat
    可以通过jhat -J-Xmx5120m xxx.hprof来进行分析,执行后会产生一个Web服务,然后可以通过这个web服务查看具体的堆栈情况。但是经过实际测试,在本地的堆栈是4GB大小的时候,依然无法打开,会报OOM错误。
    在找了内存为32G的机器后,可以执行成功,但是堆栈分析中histogram部分依然无法打开。因此,这种,在面对超大的堆栈的时候,依然无法满足我们的需求。
  3. eclipse MAT
    这里分两部分,对于较小的堆栈,可以使用其图形化界面的软件直接分析,而重点是对大堆栈的分析过程。
    在下载该软件,解压完成后。可以在执行目录发现MemoryAnalyzer.ini,可以修改其中的配置,增大内存配置。根据实际使用的经验,和要分析的堆栈大小差不多即可以。
    然后执行如下的命令:
./ParseHeapDump.sh xxx.hprof  org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components

如果堆栈较大,这个执行时间会比较长,实际使用约4G的堆栈,执行实际在5分钟左右。完成后会得到一些文件,其中包括三个ZIP格式的分析报告,分别是m_Leak_Suspects.zip, m_System_Overview.zip, m_Top_Components.zip
解压后就可以获得对应的分析报告,然后可以使用浏览器直接打开里边的index.html浏览。

image.png

因本次分析未保存图片以及部分数据不适宜公开,使用https://www.codenong.com/cs106586557的实例图片

这个分析报告也可以用MAT打开。

总结

以上就是本期的内容,最后提两点。一个是日常应该尽量避免配置大堆栈,这种一旦出现问题还是不好分析的,像业务应用这种,如果采用容器的集群部署,一方面能优化资源使用,一方面也能避免大堆栈,降低运维成本。第二点呢,堆栈分析属于事后分析,如果能提供足够的日志和监控告警,提前发现问题,或许就能减少因意外故障造成的损失。

参考资料

  1. jvm内存快照dump文件太大,怎么分析
  2. java命令--jhat命令使用

相关文章

  • Java大堆栈分析的经验

    背景 相信有不少人遇到过线上业务出现问题,为排查导出线上业务堆栈,但是最后发现导出的堆栈文件过大,少则2-3G,多...

  • JDK的bin下的工具有哪些功能

    Java生产环境下问题排查 Java内存泄漏分析系列之一:使用jstack定位线程堆栈信息 Java内存泄漏分析系...

  • 【java】 JAVA 堆栈分析命令

    top -Hp ${pid} jstack -l ${pid} > xxx.jstack注:一般间隔几秒...

  • jvm 性能调优工具之 jstack

    概述 jstack是jdk自带的线程堆栈分析工具,使用该命令可以查看或导出 Java 应用程序中线程堆栈信息。 J...

  • jvm 性能调优工具之 jstack

    概述 jstack是jdk自带的线程堆栈分析工具,使用该命令可以查看或导出 Java 应用程序中线程堆栈信息。 J...

  • Java线程堆栈分析

    姓名 连嘉玮 学号 16040120089 转自:http://www.jianshu.com/p/9426e68...

  • Java线程堆栈分析

    不知觉间工作已有一年了,闲下来的时候总会思考下,作为一名Java程序员,不能一直停留在开发业务使用框架上面。老话说...

  • Java高级工程师学习路径

    第一章 多线程并发编程 1.1 Java基础 1.1.1 JAVA程序运行堆栈分析1.1.2 线程状态1.1.3 ...

  • crash之野指针

    例子一 堆栈信息 根据堆栈分析:1,野指针2,有对应的堆栈查看堆栈代码,看那些有可能野指针: 分析所有参数:url...

  • Frida Hook

    - Hook Dlopen - Java堆栈打印 - Native堆栈打印 - HookJava中的loadLib...

网友评论

      本文标题:Java大堆栈分析的经验

      本文链接:https://www.haomeiwen.com/subject/xufypltx.html