JVM诊断

查看堆栈

jstack

jstack 是 JDK 自带的工具,用于 dump 指定进程 ID(PID)的 JVM 的线程堆栈信息。
jstack PID

打印关于锁的信息
jstack -l PID

JVM进程可能挂起,强制打印堆栈信息
jstack -F PID

OOM日志

JVM 发生 OOM 时,会自动在 /var/log/abc 目录下产生堆 dump 文件 java_pidPID.hprof
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/abc/

获取内存详情
jmap -dump:format=b,file=pid.hprof pid
这种方式可以用 jvisualvm.exe 进行内存分析,或者采用 JProfile工具可直接打开

获取内存dump
jmap -histo:live pid
这种方式会先出发fullgc,所有如果不希望触发fullgc 可以使用jmap -histo pid

jdk启动加参数:
-XX:+HeapDumpBeforeFullGC
-XX:HeapDumpPath=/httx/logs/dump
这种方式会产生dump日志,再通过jvisualvm.exe 或者Eclipse Memory Analysis Tools 工具进行分析

jmap

jmap 也是 JDK 自带的工具,主要用于获取堆相关的信息。

dump 到指定文件二进制格式
jmap -dump:format=b,file=FILE_WITH_PATH pid

JVM 进程未响应命令,可以加上参数 -F 尝试
jmap -F -dump:format=b,file=FILE_WITH_PATH pid

只 dump 堆中的存活对象,加上 live 子参数;但使用 -F 时不支持 live。
jmap -dump:live,format=b,file=FILE_WITH_PATH pid

查看进程的内存映像信息,类似 Solaris pmap 命令。
jmap pid

显示Java堆详细信息,打印一个堆的摘要信息,包括使用的GC算法、堆配置信息和各内存区域内存使用信息
jmap -heap pid

显示堆中对象的统计信息,其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。打印的虚拟机内部的类名称将会带有一个’*’前缀。如果指定了live子选项,则只计算活动的对象。
jmap -histo:live pid

头7条
jmap -histo:live 1194417 | head -7

这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用, 线上系统慎用。

Top

top |grep 1194417

top -Hp 1194417
可以查看该进程下各个线程的cpu使用情况

printf “%x\n” 1203885
jstack 1194417

jstat可以实时监测系统资源占用与jvm运行情况

Options — 选项,我们一般使用 -gcutil 查看gc情况
vmid — VM的进程号,即当前运行的java进程号
interval– 间隔时间,单位为秒或者毫秒
count — 打印次数,如果缺省则打印无数次

jstat -gcutil 19470 1000 5

S0 — Heap上的 Survivor space 0 区已使用空间的百分比
S1 — Heap上的 Survivor space 1 区已使用空间的百分比
E — Heap上的 Eden space 区已使用空间的百分比
O — Heap上的 Old space 区已使用空间的百分比
P — Perm space 区已使用空间的百分比
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)

pmap

pmap -x 22587 | sort -n -k3 >pmap.txt

Address Kbytes RSS Dirty Mode Mapping

00000002f0800000 20986752 19815212 19815212 rw— [ anon ]

Address: 内存分配地址
Kbytes: 实际分配的内存大小
RSS: 程序实际占用的内存大小
Mapping: 分配该内存的模块的名称

------ 本文结束------

本文标题:JVM诊断

文章作者:Perkins

发布时间:2020年08月31日

原始链接:https://perkins4j2.github.io/posts/1399911/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。