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

posted @ 2021-01-19 10:01  鼠标的博客  阅读(245)  评论(0编辑  收藏  举报