JVM-JVM度量与排错-基本指令

目录

目标

配置

jmap

用法

选项作用

jstat

用法

选项作用

jstack

用法

选项作用

死锁侦测结果

问题定位


目标

无论是排查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可使用的线程数量

JVM-JVM度量与排错-基本指令    

Heap的配置信息

JVM-JVM度量与排错-基本指令

当前内存快照,各代的内存使用情况

JVM-JVM度量与排错-基本指令

String字符串(字面量)常量对象个数与占用内存大小

JVM-JVM度量与排错-基本指令

-histo[:live]

列举Heap中class维度的信息,如:class的全路径,class实例的数量,class实例占用的内存。
live,则只显示live object的信息

-clstats

 关于classloader的统计,针对每个loader提供parent关系、加载class数量与字节量、是否存活、具体类型,另提供汇总信息。

JVM-JVM度量与排错-基本指令

-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总耗时

JVM-JVM度量与排错-基本指令

-gccapacity

各代容量上下限、当前量、YGC FullGC的次数

JVM-JVM度量与排错-基本指令

-gccause

各代占用比例,YGC FullGC的次数与耗时,GC总耗时,FullGC原因(Allocation Failure 分配空间失败)

JVM-JVM度量与排错-基本指令

-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和本地线程栈帧,死锁侦测结果。内容不详细,不易理解。

死锁侦测结果

展示死锁数量并列举详情

举例

JVM-JVM度量与排错-基本指令

问题定位

cpu高

定位占用cpu资源多的线程 

阻塞

死锁原因,见上文

等待其他资源的原因

  • Object wait notify
    • 通过关键字WAITING (on object monitor),定位正等待的线程
    • 方式1
      • 通过线程栈找到wait的位置,notify对应的代码
    • 方式2
      • 通过栈找到正等待的监视器编号
      • 通过编号找到当前持有该监视器的线程
  • java.util.concurrent.locks
    • 比较难定位问题,condition await signal时编号不一致