JVM 分析工具和查看命令
Java Development Kit (JDK) 命令行 工具
监视JVM
jps 虚拟机进程状况工具
(JavaVirtual Machine Process Status Tool)
命令格式:
jps [options] [<hostid>]
-options
-q
: 抑制类名的输出,JAR文件名和传递给main方法的参数,仅生成本地JVM标识符列表。-m
: 显示传递给该main方法的参数。输出可能是null嵌入式JVM。-l
: 显示应用程序main类的完整包名或应用程序的JAR文件的完整路径名。-v
: 显示传递给JVM的参数。-V
: 抑制类名的输出,JAR文件名和传递给main方法的参数,仅生成本地JVM标识符的列表。-Joption
: 传递option给JVM,其中的选项是optionsJava应用程序启动器的参考页面中描述的选项之一。,例如,-J-Xms48m将启动内存设置为48 MB。
-hostid
:
[protocol:][[//]hostname][:port][/servername]
- 输出格式
lvmid [ [ classname | JARfilename | “Unknown”] [ arg* ] [ jvmarg* ] ]
jstat 虚拟机统计信息监控工具
Java Virtual Machine statistics monitoring tool
Jstat用于监控基于HotSpot的JVM,对其堆的使用情况进行实时的命令行的统计,使用jstat我们可以对指定的JVM做如下监控:
类的加载及卸载情况
查看新生代、老生代及metaSpace的容量及使用情况
查看新生代、老生代及metaSpace的垃圾收集情况,包括垃圾回收的次数及垃圾回收所占用的时间
查看新生代中Eden区及Survior区中容量及分配情况等
jstat工具特别强大,它有众多的可选项,通过提供多种不同的监控维度,使我们可以从不同的维度来了解到当前JVM堆的使用情况。详细查看堆内各个部分的使用量,使用的时候必须加上待统计的Java进程号,可选的不同维度参数以及可选的统计频率参数 。
语法格式如下:
命令格式:
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
option: 参数选项
-class
显示ClassLoad的相关信息;-compiler
显示JIT编译的相关信息;-gc
显示和gc相关的堆信息;-gccapacity
显示各个代的容量以及使用情况;-gcmetacapacity
显示metaspace的大小-gcnew
显示新生代信息;-gcnewcapacity
显示新生代大小和使用情况;-gcold
显示老年代和永久代的信息;-gcoldcapacity
显示老年代的大小;-gcutil
显示垃圾收集信息;-gccause
显示垃圾回收的相关信息(通-gcutil),同时显示最后一次或当前正在发生的垃圾回收的诱因;
-t
: 可以在打印的列加上Timestamp列,用于显示系统运行的时间
-h
: 可以在周期性数据数据的时候,可以在指定输出多少行以后输出一次表头
vmid
: Virtual Machine ID( 进程的 pid)
interval
: 执行每次的间隔时间,单位为毫秒
count
: 用于指定输出多少次记录,缺省则会一直打印
表头讲解
表头 | 描述 | jdk 版本 |
---|---|---|
S0 | 年轻代中第一个survivor(幸存区)已使用的占当前容量百分比 | |
S1 | 年轻代中第二个survivor(幸存区)已使用的占当前容量百分比 | |
S0C | 新生代中Survivor space中S0当前容量的大小(KB) | |
S1C | 新生代中Survivor space中S1当前容量的大小(KB) | |
S0U | 新生代中Survivor space中S0容量使用的大小(KB) | |
S1U | 新生代中Survivor space中S1容量使用的大小(KB) | |
S0CMX | 年轻代中第一个survivor(幸存区)的最大容量 (字节) | |
S1CMX | 年轻代中第二个survivor(幸存区)的最大容量 (字节) | |
E | 年轻代中Eden(伊甸园)已使用的占当前容量百分比 | |
O | old代已使用的占当前容量百分比 | |
OGC | old代当前新生成的容量 (字节) | |
EC | Eden space 当前容量的大小(KB) | |
EU | Eden space 容量使用的大小(KB) | |
OC | Old space 当前容量的大小(KB) | |
OU | Old space 使用容量的大小(KB) | |
PC | Permanent space 当前容量的大小(KB) | 1.8以下 |
PU | Permanent space 使用容量的大小(KB) | 1.8以下 |
M | MeteSpace已使用的占当前容量百分比 | |
MC | MeteSpace 当前容量的大小(KB) | 1.8及以上 |
MU | MeteSpace 使用容量的大小(KB) | 1.8及以上 |
CCSC | 压缩类空间大小(KB) | 1.8及以上 |
CCSU | 压缩类空间大小(KB) | 1.8及以上 |
YGC | 从应用程序启动到采样时发生 Young GC 的次数 | |
YGCT | 从应用程序启动到采样时 Young GC 所用的时间(秒) | |
FGC | 从应用程序启动到采样时发生 Full GC 的次数 | |
FGCT | 从应用程序启动到采样时 Full GC 所用的时间(秒) | |
GCT | 从jvm启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC |
示例
jstat -gc -h5 -t 26316 1s 20
-gc 选项
-h5 每隔5行显示一下表头
-t 显示从虚拟机启动在当前时间的时间间隔 单位:秒
26536 线程id
2s 1秒显示一次
20 总共显示20次
故障排除
jinfo 实时查看和调整JVM配置参数
Java Configuration Info,主要作用是实时查看和调整JVM配置参数。
命令格式:
jinfo [option] <pid>
Usage:
jinfo [option] <pid>
(to connect to running process)jinfo [option] <executable <core>
(to connect to a core file)jinfo [option] [server_id@]<remote server IP or hostname>
(to connect to remote debug server)where is one of:
-flag <name>
to print the value of the named VM flag(打印指定命令行标志的名称和值)-flag [+|-]<name>
to enable or disable the named VM flag(启用或禁用指定的布尔命令行标志)-flag <name>=<value>
to set the named VM flag to the given value(将指定的命令行标志设置为指定的值)-flags
to print VM flags( 打印传递给JVM的命令行标志)-sysprops
to print Java system properties(打印Java系统属性)<no option>
to print both of the above-h | -help
to print this help message
jmap 生成虚拟机的内存转储快照(heapdump文件)
Java Memory Map, 主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。
命令格式:
jmap [ option ] pid
jmap [ option ] executable core
jmap [ option ] [server-id@]remote-hostname-or-IP
- option: 选项参数。
no option
: 查看进程的内存映像信息,类似 Solaris pmap 命令。-heap
: 显示Java堆详细信息-histo[:live]
: 显示堆中对象的统计信息-clstats
:打印类加载器信息-finalizerinfo
: 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象-dump:<dump-options>
:生成堆转储快照-F
: 当-dump没有响应时,使用-dump或者-histo参数. 在这个模式下,live子参数无效.-help
:打印帮助信息-J<flag>
:指定传递给运行jmap的JVM的参数pid
: 需要打印配置信息的进程ID。executable
: 产生核心dump的Java可执行文件。core
: 需要打印配置信息的核心文件。server-id
可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器。remote server IP or hostname
远程调试服务器的IP地址或主机名。
jhat 分析内存转储快照,不推荐使用,而且慢
Java Heap Analyse Tool,是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言.
命令格式:
jhat [ options ] <heap-dump-file>
参数:
options
如果使用,应该紧跟在命令之后。
heap-dump-file
java二进制堆镜像,对于包含多个堆镜像的,你可以用#指定文件中的堆,例如 “foo.hprof#3”
OPTIONS
-stack false/true
关闭跟踪对象分配调用栈。注意,如果堆镜像中分配位置信息不可用,你不得不设置成false。默认是true。
-refs false/true
关闭跟踪对象引用。默认是true。默认情况下,back pointers(指向给定对象a.ka的引用,或者in-coming应用)适用于堆中的所有对象。
-port port-number
给jhat的HTTP服务器设置端口。默认是7000。
-exclude exclude-file
指定一个数据成员列表文件,排除可达对象查询。例如,如果文件列出 java.lang.String.value,那么,从指定对象o中计算出的可达对象列表,只要引用路径涉及java.lang.String.value 字段将不会被考虑在内。
-baseline baseline-dump-file
指定一个基线堆镜像。两个堆中的相同对象ID将被标记为非new。其他对象标记为new。对于比较两个不同的堆镜像是有用的。
-debug int
设置debug级别。0 debug输出。设置更高级别获得更多模式。
-version
报告版本号,退出。
-h
帮助
-help
帮助
-J<flag>
JVM参数
jstack 堆栈跟踪工具
用来生成JVM中的线程快照(thread dump),其中包含有每个线程的方法调用栈以及其状态、锁信息等。
命令格式:
jstack [-l] <pid>
(to connect to running process)
jstack -F [-m] [-l] <pid>
(to connect to a hung process)
jstack [-m] [-l] <executable> <core>
(to connect to a core file)
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(to connect to a remote debug server)
参数的含义
-F
:如果正常执行jstack命令没有响应(比如进程hung住了),可以加上此参数强制执行thread dump。
-m
:除了打印Java的方法调用栈之外,还会输出native方法的栈帧。
-l
:打印与锁有关的附加信息。使用此参数会导致JVM停止时间变长,在生产环境需慎用。