huangjing0 2019-06-28
打印堆栈信息到标准输出 jstack PID
打印堆栈信息到标准输出,会打印关于锁的信息 jstack -l PID
强制打印堆栈信息到标准输出,如果使用 jstack PID
没有响应的情况下(此时 JVM 进程可能挂起),加 -F 参数 jstack -F PID
jcmd 可以发送命令 Thread.print 来打印出 JVM 的线程堆栈信息
jcmd PID Thread.print
命令等同于 jstack PID
jcmd PID Thread.print -l
命令等同于 jstack -l PID
kill 可以向特定的进程发送信号(SIGNAL),缺省情况是发送终止(TERM) 的信号 ,即 kill PID 与 kill -15 PID 或 kill -TERM PID 是等价的。kill -3 PID
JVM 进程会监听 QUIT 信号(其值为 3),当收到这个信号时,会打印出当时的线程堆栈和堆内存使用概要,相比 jstack,此时多了堆内存的使用概要情况。但 jstack 可以指定 -l 参数,打印锁的信息。
相关命令
# 等同 jmap -dump:live,format=b,file=FILE_WITH_PATH jcmd PID GC.heap_dump FILE_WITH_PATH # 等同 jmap -dump:format=b,file=FILE_WITH_PATH jcmd PID GC.heap_dump -all FILE_WITH_PATH # 等同 jmap -histo:live PID jcmd PID GC.class_histogram # 等同 jmap -histo PID jcmd PID GC.class_histogram -all
jmap -dump:format=b,file=FILE_WITH_PATH PID
将 JVM 的堆 dump 到指定文件,如果堆中对象较多,需要的时间会较长,子参数 format 只支持 b,即二进制格式
如果 JVM 进程未响应命令,可以加上参数 -F, jmap -F -dump:format=b,file=FILE_WITH_PATH PID
可以只 dump 堆中的存活对象,加上 live 子参数,但使用 -F 时不支持 livejmap -dump:live,format=b,file=FILE_WITH_PATH PID
获取堆概要信息 jmap -heap PID
-heap 参数用于查看指定 JVM 进程的堆的信息,包括堆的各个参数的值,堆中新生代、年老代的内存大小、使用率等
同样,如果 JVM 进程未响应命令,可以加上参数 -F,jmap -F -heap PID
一个实例输出如下:
Attaching to process ID 68322, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.112-b16 using thread-local object allocation. Parallel GC with 4 thread(s) Heap Configuration: MinHeapFreeRatio = 0 MaxHeapFreeRatio = 100 MaxHeapSize = 268435456 (256.0MB) NewSize = 8388608 (8.0MB) MaxNewSize = 89128960 (85.0MB) OldSize = 16777216 (16.0MB) NewRatio = 2 SurvivorRatio = 8 MetaspaceSize = 21807104 (20.796875MB) CompressedClassSpaceSize = 1073741824 (1024.0MB) MaxMetaspaceSize = 17592186044415 MB G1HeapRegionSize = 0 (0.0MB) Heap Usage: PS Young Generation Eden Space: capacity = 41943040 (40.0MB) used = 1701504 (1.6226806640625MB) free = 40241536 (38.3773193359375MB) 4.05670166015625% used From Space: capacity = 4194304 (4.0MB) used = 0 (0.0MB) free = 4194304 (4.0MB) 0.0% used To Space: capacity = 5242880 (5.0MB) used = 0 (0.0MB) free = 5242880 (5.0MB) 0.0% used PS Old Generation capacity = 30408704 (29.0MB) used = 12129856 (11.56793212890625MB) free = 18278848 (17.43206787109375MB) 39.889421134159484% used
获取堆中的类实例统计
# 打印 JVM 堆中的类实例统计信息,以占用内存的大小排序,同样,如果 JVM 未响应命令,也可以使用 -F 参数 jmap -histo PID # 也可以只统计堆中的存活对象,加上 live 子参数,但使用 -F 时不支持 live jmap -histo:live PID
jstat命令命令格式:
jstat [Options] PID [interval] [count]
参数说明:
Options,选项,我们一般使用 -gcutil 查看gc情况
PID,JVM的进程号
interval,间隔时间,单位为秒或者毫秒
count,打印次数,如果缺省则打印无数次
示例
jstat -gc 12538 5000
即会每5秒一次显示进程号为12538的java进成的GC情况
显示内容如下图:
{% qnimg 20150612150238390.png %}
结果说明:
S0C:年轻代中第一个survivor(幸存区)的容量 (字节) S1C:年轻代中第二个survivor(幸存区)的容量 (字节) S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节) S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节) EC:年轻代中Eden(伊甸园)的容量 (字节) EU:年轻代中Eden(伊甸园)目前已使用空间 (字节) OC:Old代的容量 (字节) OU:Old代目前已使用空间 (字节) PC:Perm(持久代)的容量 (字节) PU:Perm(持久代)目前已使用空间 (字节) YGC:从应用程序启动到采样时年轻代中gc次数 YGCT:从应用程序启动到采样时年轻代中gc所用时间(s) FGC:从应用程序启动到采样时old代(全gc)gc次数 FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s) GCT:从应用程序启动到采样时gc用的总时间(s) NGCMN:年轻代(young)中初始化(最小)的大小 (字节) NGCMX:年轻代(young)的最大容量 (字节) NGC:年轻代(young)中当前的容量 (字节) OGCMN:old代中初始化(最小)的大小 (字节) OGCMX:old代的最大容量 (字节) OGC:old代当前新生成的容量 (字节) PGCMN:perm代中初始化(最小)的大小 (字节) PGCMX:perm代的最大容量 (字节) PGC:perm代当前新生成的容量 (字节) S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比 S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比 E:年轻代中Eden(伊甸园)已使用的占当前容量百分比 O:old代已使用的占当前容量百分比 P:perm代已使用的占当前容量百分比 S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节) S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节) ECMX:年轻代中Eden(伊甸园)的最大容量 (字节) DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满) TT: 持有次数限制 MTT : 最大持有次数限制