JVM分析工具使用

1.在线分析工具

perfma: https://console.perfma.com/

获取线程 Dump 文件的命令:

1
jstack -l <pid> > 生成的文件名

获取内存 Dump 文件的命令:

1
jmap -dump:format=b,file=<dumpfile.hprof> <pid>

2.mat

JVM内存分析工具(Memory Analyzer Tool,MAT)

参考:https://www.cnblogs.com/liuchuanfeng/p/8484641.html

在首页上比较有用的是Histogram和Leak Suspects

Histogram(统计图)

可查看内存中实例的个数和大小,在子tab中按照包分组查看。优先关注自定义包的占用情况。

多次dump文件可对比,观察变化情况

Leak Suspects(可疑泄露)

点击在tab中查看可能泄露的对象,优先关注自定义包下的类

3.jstat

JVM性能实时监控的命令行工具

参考:https://blog.51cto.com/jerrymin/2352786

1.使用jstat -gc显示gc的信息,查看gc的次数,及时间

1
jstat -gc <pid> 250 20

2.使用jstat -gcutil统计gc信息

1
jstat -gcutil <pid>

3.使用top -Hp显示进程所有的线程信息查找CPU耗时最长线程PID

1
top -Hp <pid>

4.查找耗时进程是哪个函数

1
jstack <pid> |grep 3dec

4.btrace

在线跟踪运行代码执行情况

参考:http://jm.taobao.org/2010/11/11/509/

5.JVM启动参数配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
java -Dserver.port=8071 

//打印GC日志
-verbose:gc
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=100
-XX:GCLogFileSize=25M
-Xloggc:/data/logCenter/zts-intelli-app-backend/gc/gc.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCApplicationConcurrentTime

//堆溢出现场保留
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/data/logCenter/zts-intelli-app-backend/gc/heapDump/
-XX:-OmitStackTraceInFastThrow

//其它内容
-Duser.timezone=Asia/Shanghai
-Dclient.encoding.override=UTF-8
-Dfile.encoding=UTF-8
-Djava.security.egd=file:/dev/./urandom
-jar zts-intelli-app-backend.jar

参考文章:

手撕 JVM 垃圾收集日志:
https://zhuanlan.zhihu.com/p/97002196

JVM 你不可不知的参数:
https://mp.weixin.qq.com/s/thnH0qXK67jVmxkAaHmaIg