虚拟机调优工具

  • 时间:2015-07-17
  • 方式:内容来自《深入理解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

ha.png

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

jca.png

jvisualvm

可视化的、集成的JVM性能监控和分析工具,支持插件扩展,基本可以包括其他所有工具的功能;强大之处在于支持很多插件;

值得一提的是BTrace插件;这个插件利用HotSwap技术能够在不停止应用的情况下,动态的向程序中加入原本并不存在的调试代码;

以下为jvisualvm的相关资料:

BTrace使用总结 使用 VisualVM 进行性能分析及调优