文章目录

  • 常用命令
  • APM监控工具
  • eclipseMAT内存分析工具
    • 决策树
    • 直方图

今天我们来聊下生产环境排查、定位问题的工具和方法。

常用命令

jdk提供的工具类,可以用来获取java进程的内存、线程、垃圾回收等信息。

  • jstack —— 获取线程堆栈信息:

jstack -l 7055 > store-back.jstatck

  • jmap —— 获取堆中的对象信息(类的实例等)

jmap -dump:format=b,file=store-back.hprof 12131说明:需要使用eclipse MAT或者jhat工具配合,解析dump下来的内存文件。

  • OOM时自动dump方式,在java启动脚本上添加jvm命令:
    -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${目录}

  • jstat —— jvm的统计信息,包含内存使用情况、垃圾回收时间、类加载等信息:
    jstat -gcutil 21891 250 7说明:21891 进程号; 250ms 采样间隔时间,单位毫秒; 7 采集次数

APM监控工具

通常,排查生产环境的问题,我们不会远程连到服务器,使用jstack、jmap命令获取相关信息,因为这样效率太低,而且生产环境有诸多限制。我比较习惯使用APM(Application Performance Monitor)工具来快速定位和排查问题,比如pinpoint就是一款非常优秀的APM工具。

在pinpoint首页,我们可以看到应用程序之间的拓扑图,调用次数(一般生产环境采样率为10%),如下图。

图片右上角部分(如下图),有很多绿色的小点点,每个点代表一次http请求,横坐标为请求时间,纵坐标为该次请求的耗时(毫秒);红色的点表示该次请求抛异常。

我们可以用鼠标框住耗时最长的一部分“小点”,就可以查看每个请求的调用链(如下图),调用链精确到某个应用的某个类的某个方法,并打印出执行的SQL语句;以及每个方法的执行耗时和百分比。

点击“inspector”按钮,可以看到每个应用(jvm进程)的内存分配情况,比如堆、永久区(java8为metaspace)占用空间,GC执行耗时,CPU消耗,每秒事务数(TPS),活跃线程数,请求响应时间,堆外直接内存空间等等数据。一目了然,犹如上帝视角。

eclipseMAT内存分析工具

还记得第一步“常用工具”中的两个命令吧:
jmap -dump:format=b,file=store-back.hprof 12131
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${目录}

eclipseMAT就是用来分析dump下来的内存文件的。

用MAT生成内存泄漏分析报告,如下图:

通过直方图(Histogram)和支配树(Dorminator Tree)分析内存泄漏:

决策树

首先,我们通过决策树(Dorminator Tree)来分析,按package分组:

找到占用内存最大的类,如下图。

浅堆(shallow heap) : 指某一个对象本身所占内存大小(也包括外部对象的"引用",每个外部对象的"引用"为4或8个字节,分析时一般都是忽略这部分)。

保留堆(retained heap): 指对象本身和引用的“外部对象”的内存大小,但不包括“共享对象”(共享对象的概念后面会讲到)。

深堆(deep heap): 指对象本身和引用的“外部对象”的内存大小。

MAT只显示浅堆和保留堆的大小,很明显,浅堆和保留堆所占空间差距过大,就非常有可能是“内存泄漏”了。

在这里,我们怀疑Activity对象可能泄漏内存,于是查下引用此对象的是谁(with incoming references)。

我们大概看一眼,就会发现,主要是WebAppClassLoader持有大量Activity对象的引用。

使用合并最短根路径(GC ROOTS)方式,检查对象的引用路径,如下图。

Merge Shortest Path To GC Roots:快速分析的一个常用功能,它能够从当前内存映像中找到一条指定对象所在的到GC Root的最短路径。

需要排除弱引用、软引用及影子引用等,一般来说这三种类型的引用都不会是造成内存泄漏的原因,因为JVM迟早是会回收只存在这三种引用的资源的。

再次确认,要是WebAppClassLoader持有大量Activity对象的引用。我们通过决策树的方式分析,大概可以判断Activity对象是内存泄漏的最大嫌疑人。

直方图

下面我们再通过直方图的方式分析。

直方图首页,依然通过浅堆和保留堆来分析,发现FindShoppingCartByType对象可能导致内存泄漏。

查看引用人是谁(with incoming references)

咦,又看到熟悉的人了,Activity……

依然使用合并最短根路径(GC ROOTS)方式,检查对象的引用路径,如下图。

根据下图,得出结论:主要是WebAppClassLoader持有大量Activity对象的引用;Activity对象持有大量FindShoppingCartByType对象的引用。

因为本例的程序是部署在tomcat中,这就相当于是Activity对象常驻内存,无法在GC时释放。通过阅读代码,发现Activity对象是使用static声明的变量,符合我们的推断。至此,内存泄漏问题定位到了原因,后面就是改代码啦。

java性能分析与问题定位 实战相关推荐

  1. 开源java性能分析工具_Java性能监控:您应该知道的5个开源工具

    开源java性能分析工具 鲜为人知但有用:开源应用程序性能监视的状态 对于任何应用程序来说,最重要的事情之一就是性能. 我们要确保用户获得他们能获得的最佳体验,并想知道我们的应用已启动并正在运行. 这 ...

  2. 超好用的自带火焰图的 Java 性能分析工具 Async-profiler 了解一下

    如果你经常遇到 Java 线上性能问题束手无策,看着线上服务 CPU 飙升一筹莫展,发现内存不断泄露满脸茫然.别慌,这里有一款低开销.自带火焰图.让你大呼好用的 Java 性能分析工具 - async ...

  3. idea 查看jsp是否被引用_IDEA集成Java性能分析神器JProfiler

    阅读文本大概需要10分钟. <eclipse集成Java性能分析神器JProfiler>讲解了eclipse集成Jprofiler,这篇讲解一下IDEA如何集成JProfiler. 1.在 ...

  4. Java 性能分析工具一览(JDK自带)

    Jdk自带的监控程序 1. jstat 分析JVM HEAP占用情况 2. jps 查看JVM 进程 3. jmap 分析内存对象占用情况 4. jstack 查看JVM 调用堆栈情况 5. hppr ...

  5. Java 性能分析工具 , 第 3 部分: Java Mission Control

    引言 本文为 Java 性能分析工具系列文章第三篇,这里将介绍如何使用 Java 任务控制器 Java Mission Control 深入分析 Java 应用程序的性能,为程序开发人员在使用 Jav ...

  6. 【JAVA】java性能分析之线程DUMP分析

    系统上线后,系统可能会出现一些迟钝.卡死现象,这个时候就需要我们对系统进行性能方面的优化.本文将大概介绍一下,性能问题的解决思路,以及一次应用系统操作缓慢的分析实操. 一.定位问题方向 首先,查看服务 ...

  7. java性能分析工具_java性能分析工具

    如何利用 JConsole观察分析Java程序的运行,进行排错调优 http://jiajun.iteye.com/blog/810150 如何使用JVisualVM进行性能分析 http://jia ...

  8. Java性能分析点滴

    性能测试工具点滴 中说明了性能测试的工具选择,如果软件存在性能问题,我们改如何解决呢?此时一些性能分析工工具会起到作用. 名词 http://en.wikipedia.org/wiki/Profili ...

  9. 5款Java性能分析工具的对比

    在给客户的应用程序维护的过程中,我注意到在高负载下的一些性能问题.理论上,增加对应用程序的负载会使性能等比率的下降.然而,我认为性能下降的比率远远高于负载的增加.我也发现,性能可以通过改变应用程序的逻 ...

最新文章

  1. Spring的静态注入
  2. tar exclue文件夹
  3. MAT之DT:DT实现根据乳腺肿瘤特征向量高精度预测肿瘤的是恶性还是良性
  4. 利用jvisualvm分析JVM,进行性能调优
  5. 最新最详细最简洁Eclipse调试PHP配置详解(Xdebug,Zend Debugger)
  6. Apache ActiveMQ 5.9发布
  7. 双11实时物流订单实践
  8. 2021年3月15日_读书|总结笔记目录
  9. java tcp怎么拆包_Java网络编程基础之TCP粘包拆包
  10. 101-字符串类string基础使用
  11. leetcode python3 简单题217. Contains Duplicate
  12. C#自动切换Windows窗口程序,如何才能调出主窗口?
  13. mysql5.7.22并行回放_技术分享 | 从库 MTS 多线程并行回放(二)
  14. MessageDigest
  15. 新医药与生命健康专题讲座
  16. java 实现 PTF远程连接带有中文下载,解决文件损失
  17. win7电脑蓝屏怎么办
  18. 如何使用音频转换器将多个音频合并为一个音频
  19. shell 中if判读使用总结
  20. 周昆 浙江大学计算机学院院长,浙江大学周昆教授来校作学术报告

热门文章

  1. ABAP源程序---发票校验明细表
  2. 聚焦2020年财报:进击的恒大汽车,“变态”的智能汽车
  3. 买淘宝特价版,产业升级的证明
  4. php写的微信聊天界面,浅谈 聊天界面 核心架构设计
  5. springwebflux 页面_Spring Webflux 响应式框架入门
  6. pandas如何保存在excel里面_【精选】Pandas一站式教程!
  7. iis php json文件,配置iis支持.json格式的文件
  8. Python基础教程:repr()与str() 的区别
  9. python实现进度条的3种方式
  10. Python回调函数用法实例