日前发现公司系统调用缓存Memcached的次数暴增,一台机器1小时达到上千万次,通过日志分析,发现有几个缓存ID频繁调用,最多者一小时调用了百万次,当时的CPU、IO也是巨高。故使用jcmd方法打印了thread信息、heap_dump信息、飞行记录仪信息。现将jcmd打印过程简要介绍如下:
- 现获得java的线程ID,用ps -ef|grep java方法;
- 用su www -lc "jcmd 14048 help" 方法获得jcmd可以打印的信息,如
- 用su www -lc "jcmd 14048 Thread.print">>/tmp/thread.out 打印线程信息至/tmp/thread.out
- 用su www -lc "jcmd 14048 GC.heap_dump /tmp/heap_dump.out" 打印dump信息至/tmp/heap_dump.out
- 用 su www -lc "jcmd 21953 JFR.start name=test duration=60s settings=default.jfc filename=output3.jfr" 命令打印飞行记录仪信息,其实飞行记录仪还可以使用jmc.exe来打印。
下面就再来说说分析这三个文件的方法
- thread.out直接more 或者 cat就可以,但是没有发现问题
- heap_dump.out用ibm的HeapAnalyzer分析,可以搜索ha.jar,这个也没有发现问题
- 最后就是飞行记录仪信息,用JDK下的jmc.exe分析,通过分析这个文件代码、线程的热点线程,找到了死循环的代码。如图