虚拟机调优工具
- 方式:内容来自《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》
- 内容来自上书;但截图和语言重新组织;只列举了常用工具
概述
给一个系统定位问题时;知识、经验是基础、数据是依据;在虚拟机问题定位中;常用的数据包括运行日志、异常堆栈、GC日志、线程快照、对快照等;适当使用jvm工具可以帮助我们快速分析和定位问题;
工具列表
jps
用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。
命令格式
jps
重要参数
- -q:不输出主类名
- -m:输出启动时传递给主类的参数
- -l:输出主类全名;如果是jar;输出路径
- -v:输出jvm参数
jstat
用来显示类装载、内存信息、垃圾回收器运行情况的工具;
命令格式
jstat 参数 pid 打印间隔 打印次数
重要参数
- -class:类装载、卸载数量、总空间及装载耗时
- -compile:统计编译行为信息。
- -gc:输出每个堆区域的当前可用空间以及已用空间(伊甸园,幸存者等等),GC执行的总次数,GC操作累计所花费的时间。
- -gccapactiy:输出每个堆区域的最小空间限制(ms)/最大空间限制(mx),当前大小,每个区域之上执行GC的次数。(不输出当前已用空间以及GC执行时间)。
- -gccause:输出-gcutil提供的信息以及最后一次执行GC的发生原因和当前所执行的GC的发生原因
- -gcnew:输出新生代空间的GC性能数据
- -gcnewcapacity:输出新生代空间的大小的统计数据。
- -gcold:输出老年代空间的GC性能数据。
- -gcoldcapacity:输出老年代空间的大小的统计数据。
- -gcpermcapacity:输出持久带空间的大小的统计数据。
- -gcutil:输出每个堆区域使用占比,以及GC执行的总次数和GC操作所花费的事件。
列 | 说明 | Jstat参数 |
---|---|---|
S0C | 输出Survivor0空间的大小。单位KB | -gc、-gccapacity、-gcnew、-gcnewcapacity |
S1C | 输出Survivor1空间的大小。单位KB | -gc、-gccapacity、-gcnew、-gcnewcapacity |
S0U | 输出Survivor0已用空间的大小。单位KB | -gc、-gcnew |
S1U | 输出Survivor1已用空间的大小。单位KB | -gc、-gcnew |
EC | 输出Eden空间的大小。单位KB | -gc、-gcnew、-gccapacity、-gcnewcapacity |
EU | 输出Eden已用空间的大小。单位KB | -gc、-gcnew |
OC | 输出老年代空间的大小。单位KB | -gc、-gccapacity、-gcold、-gcoldcapacity |
OU | 输出老年代已用空间的大小。单位KB | -gc、-gcold |
PC | 输出持久代空间的大小。单位KB | -gc、-gccapacity、-gcold、-gcoldcapacity、-gcpermcapacity |
PU | 输出持久代已用空间的大小。单位KB。 | -gc、-gcold |
YGC | 新生代空间GC时间发生的次数。 | -gc、-gccapacity、-gcnew、-gcnewcapacity、-gcold、-gcoldcapacity、-gcpermcapacity、-gcutil、-gccause |
YGCT | 新生代GC处理花费的时间。 | -gc、-gcnew、-gcutil、-gccause |
FGC | full GC发生的次数。 | -gc、-gccapacity、-gcnew、-gcnewcapacity、-gcold、-gcoldcapacity、-gcpermcapacity、-gcutil、-gccause |
FGCT | full GC操作花费的时间 | -gc、-gcold、-gcoldcapacity、-gcpermcapacity、-gcutil、-gccause |
GCT | GC操作花费的总时间。 | -gc、-gcold、-gcoldcapacity、-gcpermcapacity、-gcutil、-gccause |
NGCMN | 新生代最小空间容量,单位KB。 | -gccapacity、-gcnewcapacity |
NGCMX | 新生代最大空间容量,单位KB。 | -gccapacity、-gcnewcapacity |
NGC | 新生代当前空间容量,单位KB。 | -gccapacity、-gcnewcapacity |
OGCMN | 老年代最小空间容量,单位KB。 | -gccapacity、-gcoldcapacity |
OGCMX | 老年代最大空间容量,单位KB。 | -gccapacity、-gcoldcapacity |
OGC | 老年代当前空间容量制,单位KB。 | -gccapacity、-gcoldcapacity |
PGCMN | 持久代最小空间容量,单位KB。 | -gccapacity、-gcpermcapacity |
PGCMX | 持久代最大空间容量,单位KB。 | -gccapacity、-gcpermcapacity |
PGC | 持久代当前空间容量,单位KB。 | -gccapacity、-gcpermcapacity |
PC | 持久代当前空间大小,单位KB、 | -gccapacity、-gcpermcapacity |
PU | 持久代当前已用空间大小,单位KB | -gc、-gcold |
LGCC | 最后一次GC发生的原因 | -gccause |
GCC | 当前GC发生的原因 | -gccause |
TT | 老年化阈值。被移动到老年代之前,在新生代空存活的次数 | -gcnew |
MTT | 最大老年化阈值。被移动到老年代之前,在新生代空存活的次数。 | -gcnew |
DSS | 幸存者区所需空间大小,单位KB。 | -gcnew |
jinfo
察运行中的java程序的运行环境参数:参数包括Java System属性和JVM命令行参数,java class path等信息
命令格式
jinfo option pid
重要参数
- -flag:显示启动参数列表
- -sysprops:显示System.getProperties()的内容
- -l:输出主类全名;如果是jar;输出路径
- -v:输出jvm参数
jmap
观察运行中的jvm物理内存的占用情况;输出可以结合jhat或者imb的heap analysis使用,你可以点击这里下载
命令格式
jmap option pid
重要参数
- -heap:打印jvm heap的情况
- -histo:打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。
- -histo:live :同上,但是只答应存活对象的情况
- -permstat:打印permanent generation heap情况
- -dump: dump堆转储文件
- live 只dump存活的对象,默认是dump所有的对象
- format=b dump二进制格式文件,即jhat和jvisualvm可以分析的hprof格式
- file= dump出来文件的存储路径
示例
jmap -dump:format=b,file=./test.dump xxx
java -jar ha456.jar
jstack
主要用来查看JVM进程的线程堆栈的信息,最常用用法是dump线程转储文件,然后集合一些第三方工具(如IBM的jca)来分析线程死锁问题。jstack的好处是通过堆栈信息可以直接定位到有问题的代码行。
你可以点击这里下载jca;
命令格式
jstack option pid
重要参数
-l 输出有关锁的附加信息
-F 当进程无响应(hung住了)的时候强制的dump
-m 同时输出java和本地(c/c++)的线程帧信息
示例
jstack 22372 > debug.dump
java -jar jca455.jar
jvisualvm
可视化的、集成的JVM性能监控和分析工具,支持插件扩展,基本可以包括其他所有工具的功能;强大之处在于支持很多插件;
值得一提的是BTrace插件;这个插件利用HotSwap技术能够在不停止应用的情况下,动态的向程序中加入原本并不存在的调试代码;
以下为jvisualvm的相关资料: