使用dump以及跟进线程状态,主要为了分析一些异常问题。
一、dump
查看运行过程中dump,了解程序运行状态,进行应用优化,紧急处理问题等。
1、获取dump方式
设置JVM参数,在程序异常时生成dump文件,用于处理异常问题
出现 OOME 时生成堆 dump: -XX:+HeapDumpOnOutOfMemoryError
生成堆文件地址:-XX:HeapDumpPath=/opt/logs/XXX/HeapDumpOnOutOfMemoryError/
使用jdk自带工具实时获取dump
生成指定pid的dump文件。此方法实时生成,或导致jvm暂停,影响应用程序,建议不用在生产环境使用。
# PID 为应用程序的PID
jmap -dump:live,file=xxx.hprof PID
#jmap -dump:format=b,file=/home/admin/xxx.hprof pid
分析dump文件
生成文件后下载到本地进行分析,可选工具如Java VisualVM、MAT等,如下示例:
这里使用Java VisualVM进行分析,可以查看基本信息,类对象信息,线程信息、实例等,我们可以根据这些信息进行应用分析优化。
线程状态
在应用运行的时候,我们经常会开启多线程操作,那么怎么判断线程是否存在问题呢,该怎么排查呢?
如下使用JAVA相关工具进行分析查询:
1、top命令查询占用最大的线程,记录pid信息
# 查找问题线程,其中 -H表示线程模式
top -p PID -H。
把pid转成16进制数据
printf 0x%x 线程ID
通过jstack工具查询线程状态,得到该线程执行的具体任务,就可以分析代码线程为什么占用高了
jstack PID |grep -20 转换16进制的PID
常用工具 Java VisualVM、jstack、jps
PS小插曲:
使用jdk自带工具实时获取dump的时候,安装的openJDK的bin目录中没有jmap等相关工具,通过更新jdk后获取到相关程序
1、查看JDK版本
2、查询包含源程序的应用版本,这里需要的是jmap。
yum whatprovides '*11.0.21*/jmap'
3、安装包含jmap的源程序,这里随机选了一个,安装完成后即可使用jmap命令
yum install java-11-openjdk-devel-fastdebug-1:11.0.21.0.9-2.0.3.al8.x86_64