JVM 相关工具
JDK 工具包
jps
查看 Java 进程
jps :列出Java程序进程ID和Main函数名称
jps -q :只输出进程ID
jps -m :输出传递给Java进程(主函数)的参数
jps -l :输出主函数的完整路径
jps -v :显示传递给Java虚拟机的参数
jstat
查看 Java 程序运行时相关信息,可以查看运行时堆的相关情况
jstat -<options> [-t] [-h<lines>] <vmid> [<interval> [<count>]]options:由以下值构成
-class:显示ClassLoader的相关信息
-compiler:显示JIT编译的相关信息
-gc:显示与GC相关信息
-gccapacity:显示各个代的容量和使用情况
-gccause:显示垃圾收集相关信息(同-gcutil),同时显示最后一次或当前正在发生的垃圾收集的诱发原因
-gcnew:显示新生代信息
-gcnewcapacity:显示新生代大小和使用情况
-gcold:显示老年代信息
-gcoldcapacity:显示老年代大小
-gcpermcapacity:显示永久代大小
-gcutil:显示垃圾收集信息
示例1:
# 进程 ID 515460 ,采样间隔 250 ms,采样数 4
jstat -gc 515460 250 4
- S0C:年轻代中第一个survivor(幸存区)的容量 (单位kb)
- S1C:年轻代中第二个survivor(幸存区)的容量 (单位kb)
- S0U :年轻代中第一个survivor(幸存区)目前已使用空间 (单位kb)
- S1U :年轻代中第二个survivor(幸存区)目前已使用空间 (单位kb)
- EC :年轻代中Eden的容量 (单位kb)
- EU :年轻代中Eden目前已使用空间 (单位kb)
- OC :Old代的容量 (单位kb)
- OU :Old代目前已使用空间 (单位kb)
- MC:metaspace的容量 (单位kb)
- MU:metaspace目前已使用空间 (单位kb)
- CCSC:压缩类空间大小
- CCSU:压缩类空间使用大小
- YGC :从应用程序启动到采样时年轻代中gc次数
- YGCT :从应用程序启动到采样时年轻代中gc所用时间(s)
- FGC :从应用程序启动到采样时old代(全gc)gc次数
- FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
- GCT:从应用程序启动到采样时gc用的总时间(s)
示例2:
jstat -gcutil 515256 1s 5
# 进程ID 30108,采样间隔1s,采样数5
- S0 年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
- S1 年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
- E 年轻代中Eden(伊甸园)已使用的占当前容量百分比
- O old代已使用的占当前容量百分比
- M metaspace已使用的占当前容量百分比
- CCS 压缩使用比例
- YGC 从应用程序启动到采样时年轻代中gc次数
- YGCT 从应用程序启动到采样时年轻代中gc所用时间(s)
- FGC 从应用程序启动到采样时old代(全gc)gc次数
- FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s)
- GCT 从应用程序启动到采样时gc用的总时间(s)
jinfo
查看正在运行的 Java 程序的扩展参数
jinfo [option] <pid>option 参数:
# 打印虚拟机 VM 参数
-flags
# 打印指定虚拟机 VM 参数
-flag <name>
# 打开或关闭虚拟机参数
-flag [+|-]<name>
# 设置指定虚拟机参数的值
-flag <name>=<value>
jmap
查看堆内存使用情况,一般结合 jhat 使用
# 显示 Java 堆的详细信息
jmap -heap pid
# 显示堆中对象的统计信息
jmap -histo:live pid
# 打印类加载器信息
jmap -clstats pid
# 打印等待终结的对象信息
jmap -finalizerinfo pid
# 生成堆转储快照 dump 文件,如果堆内存较大,该命令比较耗时,并且该命令执行过程中会暂停应用,线程系统慎用
jmap -dump:format=b,file=heapdump.hprof pid
jhat
jhat 命令会解析 Java 堆转储文件,并且启动一个 web server,再用浏览器就可以查看 dump 出来的 heap 二进制文件
使用 jmap -dump
可以在 jvm 运行时获取 dump
再通过 jhat ./heapdump.hprof
命令,就可以启动一个 web server,用浏览器访问即可
jstack
用于生成 Java 虚拟机当前时刻的线程快照,生成线程快照的主要目的是定位线程出现长时间停顿的原因
生成的线程快照中,需要主要留意以下几种状态:
- 死锁,Deadlock
- 等待资源,Waiting on condition
- 等待获取管程,Waiting on monitor entry
- 阻塞,Blokced
# 查看当前时间点,指定进程的dump堆栈信息
jstack [ option ] pid
# 将当前时间点的指定进程的dump堆栈信息,写入到指定文件中
jstack [ option ] pid > 文件
# 注:若该文件不存在,则会自动生成; 若该文件存在,则会覆盖源文件
# 查看当前时间点,core文件的dump堆栈信息
jstack [ option ] executable core
# 查看当前时间点,远程机器的dump堆栈信息
jstack [ option ] [server_id@]<remote server IP or hostname> # options 说明
-F # 当进程挂起了,此时'jstack [-l] pid'是没有相应的,这时候可使用此参数来强制打印堆栈信息,强制jstack),一般情况不需要使用。
-m # 打印 java 和 native c/c++ 框架的所有栈信息。可以打印 JVM 的堆栈,以及Native的栈帧,一般应用排查不需要使用。
-l # 长列表. 打印关于锁的附加信息。例如属于java.util.concurrent的ownable synchronizers列表,会使得JVM停顿得长久得多(可能会差很多倍,比如普通的jstack可能几毫秒和一次GC没区别,加了-l 就是近一秒的时间),-l 建议不要用。一般情况不需要使用。
-h or -hel # 打印帮助信息# 使用示例:统计线程数
jstack -l 513792 | grep 'java.lang.Thread.State' | wc -l
JVM 调试工具
JVM 常用调试工具有:visualvm 以及 Arthas