java应用性能分析工具-JDK命令行工具

背景

我们做的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命令

 

 

 

 jhat的默认端口为7000,在浏览器中输入192.168.0.11:7000即可查看(假设当前主机是192.168.0.11的ip)

4、jstat——虚拟机统计信息监视工具

5、jps——虚拟机进程状况工具(Java Virtual Machine Process Status Tool)

command  >> jps [options] [hostid]

说明:hostid不指定,则默认为当前主机

掌握-v参数:输出传递给JVM的参数(jps -v)在诊断JVM相关问题的时候,这个参数可以查看JVM相关参数的设置

这个命令发挥的空间不大,如果是查自己的应用,直接找pid即可;一般想整体查看很多应用的进程(企业级的,一台服务器部署多个tomcat应用)来定位时会用到

 

参考:

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  鼠标的博客  阅读(235)  评论(0编辑  收藏  举报