深入理解Java虚拟机读书笔记--7 JVM工具
对应《深入理解Java虚拟机》4.2 4.3节的内容
虚拟机性能监控 故障处理工具
系统定位问题时:知识是基础,数据是依据,工具是手段
数据包括:异常堆栈、虚拟机运行日志、垃圾收集器日志、线程快照(threaddump/javacore文件)、堆转储快照(heapdump/hprof文件)等
基础故障处理工具
jps (JVM Process Status Tool) 虚拟机进程状况工具
可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID(LVM ID
,Local Virtual Machine Identifier)。
其他的JDK工具大多需要输入它查询到的 LVM ID 来确定要监控的是哪一个虚拟机进程
> jps -help
usage: jps [-help]
jps [-q] [-mlvV] [<hostid>]
Definitions:
<hostid>: <hostname>[:<port>]
- -q 只输出LVM ID,省略主类的名称
- -m 输出虚拟机启动时传输给主类main函数的参数
- -l 输出主类的全名,若执行的是jar,则输出jar路径
- -v 输出虚拟机进程启动时的JVM参数
jstat(JVM Statistics Monitoring Tool) 虚拟机统计信息监视工具
用于监视虚拟机各种运行状态信息的命令行工具,可以显示本地或者远程虚拟机进程中的类加载
、内存
、垃圾收集
、即时编译
等运行时数据
jstat [option] vmid [interval [s|ms]] [count]
- option
- -class 监视类加载/卸载数量、总空间以及类装载所耗费的时间
- -gc 监视Java堆状况,包括伊甸区、幸存区、年老代等的容量,已用空间,垃圾收集时间合计等信息
- vmid
如果是本地虚拟机进程,VM ID 与 LVM ID 是一致的;
如果是远程虚拟机进程,那 VM ID 的格式应当是:[protocol:][//]lvmid[@hostname[:port]/servername]
- interval
查询间隔 (默认 ms)
- count
查询次数
案例:查询vmid为19552的进程每秒输出1次,一共10次
jstat -gc 19552 1000 10
jstat -gc 19552 1s 10
jinfo(Configuration Info for Java) Java配置信息工具
实时查看和调整虚拟机各项参数
> jinfo -help
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 <option> 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
-sysprops to print Java system properties
<no option> to print both of the above
-h | -help to print this help message
案例:
jinfo -flag CMSInitiatingOccupancyFraction 19552
jinfo -flag UseSerialGC 19552
https://blog.youkuaiyun.com/u010979642/article/details/88764132
jmap (Memory Map for Java) Java内存映像工具
用于生成堆转储快照(一般称为heapdump或dump文件)、查询finalize执行队列、Java堆和方法区的详细信息、空间使用率、当前用的是哪种收集器等
使用-XX:+HeapDumpOnOutOfMemoryError
参数也可以让虚拟机在内存溢出异常出现之后自动生成堆转储快照文件
jmap [option]
使用 jmap -h 可查看所有可选项
案例:生成堆快照文件
jmap -dump:format=b,file=dump.bin 19552
案例:显示Java堆详细信息
jmap -heap 144
Attaching to process ID 144, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.221-b11
using thread-local object allocation.
Parallel GC with 13 thread(s)
...
jhat (JVM Heap Analysis Tool) 虚拟机堆转储快照分析工具
与 jmap 搭配使用,来分析 jmap -dump 生成的堆转储快照
jhat内置了一个微型的HTTP/Web服务器,生成堆转储快照的分析结果后,可以在浏览器中查看
VisualVM 、Eclipse Memory Analyzer 也都可以用来分析堆转储快照,且比 jhat 功能强大
jhat dump.bin
提示 Server is ready 后,在浏览器中输入 http://localhost:7000/
可以看到分析结果
jstack (Stack Trace for Java) Java堆栈跟踪工具
用于生成虚拟机当前时刻的线程快照
;
线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的通常是定位线程出现长时间停顿的原因
jstack [option] vmid
- -F 当正常输出的请求不被响应时,强制输出线程堆栈
- -l 除堆栈外,显示关于锁的附加信息
- -m 如果调用本地方法的话,可以显示C/C++的堆栈
案例:
jstack -l 144
其他工具
查看$JAVA_HOME/bin下的工具,每个JDK版本下的工具会有差别
jdk1.8下会有一个 jvisualvm 工具,是一种图形化工具;提供内存和CPU分析,堆文件分析、内存泄露检测、MBean访问和垃圾收集;但从jdk9开始不再打包进JDK中,需要独立下载
jcmd (JVM Command 虚拟机诊断命令工具)将诊断命令请求发送到正在运行的Java虚拟机