一、dump

查看运行过程中dump,了解程序运行状态,进行应用优化,紧急处理问题等。

1、获取dump方式

a 、设置JVM参数,在程序异常时生成dump文件,用于处理异常问题。

出现 OOME 时生成堆 dump: -XX:+HeapDumpOnOutOfMemoryError 生成堆文件地址:-XX:HeapDumpPath=/opt/logs/XXX/HeapDumpOnOutOfMemoryError/ b、使用jdk自带工具实时获取dump

生成指定pid的dump文件。此方法实时生成,或导致jvm暂停,影响应用程序。

jmap -dump:live,file=xxx.hprof PID jmap -dump:format=b,file=/home/admin/heap.hprof pid

其他 jstack,jps: jstack pid > thread.txt c、分析dump文件

生成文件后下载到本地进行分析,可选工具如Java VisualVM、MAT等,如下示例:

可以查看基本信息,类对象信息,线程信息、实例等,进行应用分析优化。

Open image-20240202-160437.png image-20240202-160437.png 二、分析工具

Java VisualVM、jstack、jps

jstack

Usage: jstack [-l][-e] (to connect to running process) Options: -l long listing. Prints additional information about locks -e extended listing. Prints additional information about threads -? -h --help -help to print this help message 查找指定线程状态

a、top命令查询占用最大的线程,记录pid信息

通过top -p PID -H查找问题线程。 其中 -H表示线程模式 b、把pid转成16进制数据

printf 0x%x 线程ID c、通过如下命令查询线程状态

jstack PID |grep -20 转换16进制的PID

jps

jps语法 usage: jps [--help] jps [-q] [-mlvV] []

jps [ options ] [ hostid ] options是命令行参数,hostid指特定主机,可以是ip地址、域名, 也可以指定具体协议和端口。 options参数说明 -q 只输出PID。 -m 输出传递给 main 方法的参数。对于嵌入式 JVM,输出可能为空。 -l 输出应用程序主类的完整包名或应用程序 JAR 文件的完整路径名。 -v 输出传递给 JVM 的参数。 -V 通过 flags 文件(.hotspotrc 文件或 -XX:Flags=< filename > 参数指定的文件)输出传递给 JVM 的参数。本参数不常用。 -Joption 将选项传递给jps调用的java启动器。例如,-J-Xms48m是将启动内存设置为 48 兆字节。

PS:

小插曲,安装的openJDK的bin目录中没有jmap等相关工具,通过更新jdk后获取到相关程序

1、查看jdk版本

Open image-20240202-154830.png image-20240202-154830.png 2、查询包含源程序的应用版本,这里需要的是jmap。

yum whatprovides '11.0.21/jmap' Open image-20240202-154946.png image-20240202-154946.png 3、安装包含jmap的源程序,这里随机选了一个

yum install java-11-openjdk-devel-fastdebug-1:11.0.21.0.9-2.0.3.al8.x86_64 4、安装完成后即可使用jmap命令