Java定位问题好用的工具
JDK 自带工具查看 JVM 情况
常用的监控工具
使用 Wireshark 分析 SQL 批量插入慢的问题
案例:
有一个数据导入程序需要导入大量的数据,想到了使用 Spring JdbcTemplate 的批量操作功能进行数据批量导入,但是发现性能非常差,和普通的单条 SQL 执行性能差不多。
分析:
其实,对于批量操作,我们希望程序可以把多条 insert SQL 语句合并成一条,或至少是一次性提交多条语句到数据库,以减少和 MySQL 交互次数、提高性能。那么,我们的程序是这样运作的吗?
解决:
分析问题一定需要依据,可以使用网络分析工具 Wireshark 来分析一下这个案例, Wireshark可以来观察、分析应用程序与 MySQL 交互的整个流程。
使用 MAT 分析 OOM 问题
对于排查 OOM 问题、分析程序堆内存使用情况,最好的方式就是分析堆转储。
堆转储,包含了堆现场全貌和线程栈信息(好似得到了病人在某个瞬间的全景核磁影像);
Memory Analyzer(也叫做 MAT)做堆转储的分析
使用 MAT 分析 OOM 问题,一般可以按照以下思路进行:
1. 通过支配树功能或直方图功能查看消耗内存最大的类型,来分析内存泄露的大概原因;
2. 查看那些消耗内存最大的类型、详细的对象明细列表,以及它们的引用链,来定位内存泄露的具体点;
3. 配合查看对象属性的功能,可以脱离源码看到对象的各种属性的值和依赖关系,帮助我们理清程序逻辑和参数;
4. 辅助使用查看线程栈来看 OOM 问题是否和过多线程有关,甚至可以在线程栈看到 OOM 最后一刻出现异常的线程。
使用 Arthas 分析高 CPU 问题
Arthas是阿里开源的 Java 诊断工具,相比 JDK 内置的诊断工具,要更人性化,并且功能强大,可以实现许多问题的一键定位,而且可以一键反编译类查看源码,甚至是直接进行生产代码热修复,实现在一个工具内快速定位和修复问题的一站式服务。
通过 Arthas 工具排查了高 CPU 的问题常用步骤:
1. 首先,通过 dashboard + thread 命令,基本可以在几秒钟内一键定位问题,找出消耗 CPU 最多的线程和方法栈; 2. 然后,直接 jad 反编译相关代码,来确认根因; 3. 此外,如果调用入参不明确的话,可以使用 watch 观察方法入参,并根据方法执行时间来过滤慢请求的入参。
除了阿里 Arthas 之外,还可以关注去哪儿的Bistoury 工具,其提供了可视化界面,并且可以针对多台机器进行管理,甚至提供了在线断点调试等功能,模拟 IDE 的调试体验。
总结
JDK 自带的一些监控和故障诊断工具中,有命令行工具也有图形工具。其中,命令行工具更适合在服务器上使用,图形界面工具用于本地观察数据更直观。为了帮助你用好这些工具,我们带你使用这些工具,分析了程序错误设置 JVM 参数的两个问题,并且观察了 GC 工作的情况。
通过 Wireshark 分析网络包可以让一切变得如此透明。因此,Wireshark,对我们排查 C/S 网络程序的 Bug 或性能问题,会有非常大的帮助。
比如,遇到诸如 Connection reset、Broken pipe 等网络问题的时候,你可以利用 Wireshark 来定位问题,观察客户端和服务端之间到底出了什么问题。
案例:一个 OOM 问题,通过查监控、查日志、查调用链路排查了数小时也无法定位问题,但使用堆转储文件后,直接打开支配树图一眼就看到了可疑点。Mybatis 每次查询都查询出了几百万条数据,通过查看线程栈马上可以定位到出现 Bug 的方法名,然后来到代码果然发现因为参数条件为 null 导致了全表查询,整个定位过程不足 5 分钟。
因此,使用正确的工具、正确的方法来分析问题,几乎可以在几分钟内定位到问题根因。今天,我和你介绍的 MAT 正是分析 Java 堆内存问题的利器,而 Arthas 是快速定位分析 Java 程序生产 Bug 的利器。利用好这两个工具,就可以帮助我们在分钟级定位生产故障。
原文链接:https://time.geekbang.org/column/article/230534