java应用性能分析工具-JDK命令行工具
频率最高的几个
jps :列出java程序进程
top -Hp <pid> :查这个pid进程中,最耗CPU的线程的pid
printf '%x' <pid> :输出这个pid的
jstack <pid> |grep <16进制的线程pid> :打印这个线程对应的堆栈信息片段
jmap -histo:live <pid> | head -20 :查看这个进程对应的堆内存中,活动对象的个数和占用的空间
jmap -dump[:live,] format=b, file=filename <pid> :输出堆信息到二进制文件中,后续可以使用二进制工具读取
背景
我们做的java应用涉及到kafka消息消费后入数据库的业务,由于kafka协议复杂,入库前包括解析,分析,组装数据过程,在数据量较大时(3000万以上,峰值1亿)
CPU使用率常常飙升,时不时会有入库过程阻塞,处理变得非常慢,在其他的文章中总结过基础的top,free等命令来分析CPU和内存使用情况,作为java开发提升的技
能这里专门开一个JDK的命令行工具,来分析研发编码过程可能出现的性能问题(OOM,cpu消耗高,dead lock等)
介绍
Oracle官网将JDK tool分了很多类,这里主要讲2大类5小类(java7)
官网地址:https://docs.oracle.com/javase/8/docs/technotes/tools/unix
1、jstack——java堆栈信息工具(查看某个进程内的线程堆栈信息)
>> jstack [option] pid
>> jstack [option] executable core
option:掌握一个 -l (long listings),打印额外的锁信息,发生死锁时用jstack -l pid 观察死锁持有情况
使用jstack 定位最耗CPU的堆栈对应的代码段过程:
(1)>> ps -ef |grep dgList 找出应用的pid(dgList是我的tomcat应用),查出结果pid=63977
(2)>> top -Hp 63977 找到耗费CPU时间最长的可能线程pid=135784
(3)>> printf "%x" 135784 结果为21268(135784 的16进制值)
(4)>> jstack 63977 |grep 21268 从打印的堆栈信息中找到线程135784对应堆栈信息片段
以下是选择排在前三的线程pid,分别grep后的结果:
"redisMessageListenerContainer-9421" #9849 prio=5 os_prio=0 tid=0x00007f317c001000 nid=0x21268 runnable [0x00007f32312d5000]
"ruleKafka-0-C-1" #79 prio=5 os_prio=0 tid=0x00007f332e167000 nid=0xffdd runnable [0x00007f32fcedb000]
"basicKafka-0-C-1" #81 prio=5 os_prio=0 tid=0x00007f332e1f6000 nid=0xffdf runnable [0x00007f32fccd9000]
第一个是监听redis消息判断license的业务,第二三个是监听kafka消息的两个业务功能
另:>> jstack pid > thread.txt 可以将命令结果转存到thread.txt文件中
2、jmap——java内存映像工具
>> jmap -heap pid 查看进程堆内存信息
>> jmap -histo:live pid | head -20 查看堆内存中的活动对象数目、大小统计直方图排前17的,[:live]为可选
>> jmap -dump[:live,] format=b, file=filename pid
将堆信息以hprof binary格式写到 filename中,生成的文件可使用jhat(Java Heap Analysis Tool)读取和分析,filename为文件
如执行 >>jmap -dump format=b,file=dump.hprof 63977 将在当前目录下生成dump.hprof 二进制文件
读取改文件需要使用jhat命令
3、jhat——读取.hprof文件,输出到浏览器中
jhat的默认端口为7000,在浏览器中输入192.168.0.11:7000即可查看(假设当前主机是192.168.0.11的ip)
4、jstat——虚拟机统计信息监视工具
jstat -gc <pid> 查看堆内存分布情况
5、jps——虚拟机进程状况工具(Java Virtual Machine Process Status Tool)
command >> jps [options] [hostid]
说明:hostid不指定,则默认为当前主机
掌握-v参数:输出传递给JVM的参数(jps -v)在诊断JVM相关问题的时候,这个参数可以查看JVM相关参数的设置
这个命令发挥的空间不大,如果是查自己的应用,直接找pid即可;一般想整体查看很多应用的进程(企业级的,一台服务器部署多个tomcat应用)来定位时会用到
6、jinfo——查看java应用程序的扩展参数
jinfo <pid>
参考:
https://www.cnblogs.com/lazy-fc/p/11297953.html
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html#BEHHGFAE