JVM-JVM度量与排错-基本指令
目录
目标
无论是排查jvm问题,如oom、cpu高等,还是度量jvm表现,可能需要使用jmap、jstat、jstack指令。本文介绍3个指令的用法。
配置
用于输出gc信息的配置
-XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime
-XX:+PrintHeapAtGC -XX:+PrintGCTimeStamps -Xloggc:存储gclog的文件路径
保存现场的配置
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=存放dump的目录
jmap
heap容量配置等概要、dump等。
用法
- jmap [option] <pid> 连接到正在运行的vm
- jmap [option] <executable <core> 连接core文件
- jmap [option] [[email protected]]<remote server IP or hostname> 连接远程vm
选项作用
-heap
年轻代使用的GC
年老代使用的GC
年轻代内存分配方式,并行GC可使用的线程数量
Heap的配置信息
当前内存快照,各代的内存使用情况
String字符串(字面量)常量对象个数与占用内存大小
-histo[:live]
列举Heap中class维度的信息,如:class的全路径,class实例的数量,class实例占用的内存。
live,则只显示live object的信息
-clstats
关于classloader的统计,针对每个loader提供parent关系、加载class数量与字节量、是否存活、具体类型,另提供汇总信息。
-finalizerinfo
等待回收的object数量,结果如Number of objects pending for finalization: 0
-dump:<dump-options>
heap dump
dump-options
- live 仅dump 存活对象;否则dump 所有对象。
- format=b 二进制
- file=<file> dump文件位置
使用举例
-dump:live,format=b,file=xxxx/dump.bin
-F
强制执行
jstat
提供JVM的表现信息以及应用的资源消耗信息,如与垃圾回收相关的统计信息,代相关信息,用来诊断表现性问题,heap大小问题,gc问题
用法
jstat -help|-options
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
选项作用
-t 表头显示Timestamp,即vm运行的总时间
-h<lines> 表头之间显示样本行数,如-h2 2个样表生成一个表头
vmid 即pid
interval 多久输出一条样本记录,可用单位ms s,默认ms
count 输出count条样本记录后,采集自动结束
option
-gc
各代容量与占用情况,YGC FullGC的次数与耗时,GC总耗时
-gccapacity
各代容量上下限、当前量、YGC FullGC的次数
-gccause
各代占用比例,YGC FullGC的次数与耗时,GC总耗时,FullGC原因(Allocation Failure 分配空间失败)
-gcutil
与-gccause显示内容相似,不包括原因
-gcmetacapacity
meta空间容量上下限、当前量、YGC FullGC的次数
-gcnew
年轻代中各代容量 占用量 YGC次数与总耗时
-gcnewcapacity
-gcold
-gcoldcapacity
-printcompilation
-class 加载卸载的class数量 耗时
-compiler 编译器相关
jstack
用于输出虚拟机当前所有线程栈信息,包括java线程、VM内部线程、本地线程,并且可侦测死锁。
用法
连接正在运行的进程 jstack [-l] <pid>
强制连接无反应的进程 jstack -F [-m] [-l] <pid>
连接core文件 jstack [-m] [-l] <executable> <core>
连接远程进程 jstack [-m] [-l] [[email protected]]<remote server IP or hostname>
选项作用
不加option 详细列举栈帧,死锁侦测结果
-l 详细列举栈帧,死锁侦测结果,是否已获取Lock实现的锁。
-F 当jstack <pid>无反应时,强制进行thread dump.
-m mixed形式列举java和本地线程栈帧,死锁侦测结果。内容不详细,不易理解。
死锁侦测结果
展示死锁数量并列举详情
举例
问题定位
cpu高
定位占用cpu资源多的线程
阻塞
死锁原因,见上文
等待其他资源的原因
- Object wait notify
- 通过关键字WAITING (on object monitor),定位正等待的线程
- 方式1
- 通过线程栈找到wait的位置,notify对应的代码
- 方式2
- 通过栈找到正等待的监视器编号
- 通过编号找到当前持有该监视器的线程
- java.util.concurrent.locks
- 比较难定位问题,condition await signal时编号不一致