《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》4章
本章介绍的工具基于Windows平台下JDK1.6 Update 21
JDK1.5需手动开启JMX,JDK1.6默认开启
这些工具大多是jdk/lib/tools.jar类库的一层薄包装
命令行工具:
1. jps(JVM Process Status Tool)
虚拟机进程状况工具,输入LVMID以确定是哪个虚拟机进程
功能单一,使用频率最高
命令格式:
jps [options] [hostid]
选项:
例:
jps -l
2. jstat(JVM Statistics Monitoring Tool)
虚拟机统计信息监视工具,监视虚拟机各种运行状态信息,可显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据
无GUI图形界面服务器运行期定位虚拟机性能问题的首选工具
命令格式:
jstat [option vmid [interval [s|ms] [count] ] ]interval 查询间隔,count 查询次数,若省略这两个参数则只查询一次
选项:
例:
jstat -gcutil 2764
3. jinfo(Configuration Info for Java)
Java配置信息工具,可实时地查看和调整虚拟机各项参数
Windows平台只提供最基本的-flag选项
命令格式:
jinfo [option] pid
选项:
-v:查看虚拟机启动时显式指定的参数列表-flag:查看未被显式指定的参数的系统默认值,JDK1.6及以上版本可使用java -XX:+PrintFlagsFinal查看参数默认值-sysprops:打印虚拟机进程的System.getProperties()内容打印,JDK1.5在Linux版提供,JDK1.6之后在Windows和Linux提供-flag [+|-] <name>或-flag <name>=<value>,修改部分运行期可写的虚拟机参数
例:
jinfo -flag CMSInitiatingOccupancyFraction 1444
4. jmap(Memory Map for Java)
Java内存映像工具,用于生成堆转储快照(一般称heapdump或dump文件),另外也可查询finalize执行队列、Java堆和永久代详细信息,如空间使用率、当前用的是哪种收集器等
Windows平台只提供-dump、-histo选项
获取Java堆转储快照的其他“暴力”手段:
使用-XX:+HeapDumpOnOutOfMemoryError,虚拟机在OOM异常出现之后自动生成dump文件使用-XX:+HeapDumpOnCtrlBreak,使用[Ctrl]+[Break]生成dump文件在Linux系统使用Kill -3发送进程退出信号“吓唬”虚拟机生成dump文件
命令格式:
jmap [option] vmid
选项:
例:
jmap -dump:format=b,file=eclipse.bin 3500
5. jhat(JVM Heap Analysis Tool)
虚拟机堆转储快照分析工具,与jmap搭配使用分析堆转储快照
分析结果可在浏览器中查看,http://localhost:7000
实际工作中一般不会直接使用jhat命令分析dump文件,原因有二:
分析工作耗时消耗硬件资源析功能相对简陋,VisualVM,专业用于分析dump文件的Eclipse Memory Analyzer、IBM HeapAnalyzer等有比jhat更强大更专业的分析功能
例:
jhat eclipse.bin
6. jstack(Stack Trace for Java)
Java堆栈跟踪工具,用于生成虚拟机当前的线程快照(方法堆栈的集合,称为threaddump或javacore文件)
生成线程快照的目的:
定位线程出现长时间停顿的原因,主要有:等待外部资源(数据库连接、网络资源、设备资源等)、死循环、锁等待(活锁和死锁)
JDK1.5 java.lang.Thread类新增getAllStackTraces()方法获取虚拟机中所有线程的StackTraceElement对象
命令格式:
jstack [option] vmid
选项:
例:
jstack -l 3500
7. HSDIS
Sun官方推荐的HotSpot虚拟机JIT编译代码反汇编插件
作用:
让HotSpot的-XX:+PrintAssembly指令调用它把动态生成的本地代码还原为汇编代码输出,同时生成了大量有价值的注释,用户通过输出的代码分析问题
安装:
根据操作系统和CPU类型从ProjectKenai网站(http://kenai.com/projects/base-hsdis)下载已编译好的插件,直接放到JDK_HOME/jre/bin/client和JDK_HOME/jre/bin/server目录中即可使用,若未找到合适版本插件可使用源码编译得到
若使用Debug或FastDebug版HotSpot,可直接通过-XX:+PrintAssembly指令使用插件
若使用Product版HotSpot,需额外加入-XX:+UnlockDiagnosticVMOptions参数
例:
java -XX:+PrintAssembly -Xcomp -XX:CompileCommand=dontinline, *Bar.sum -XX:CompileCommand=compileonly, *Bar.sum test.Bar
-Xcomp:以编译模式执行代码,这样代码可“偷懒”不需执行足够次数来预热就可触发JIT编译
-XX:CompileCommand:让编译器不要内联sum()并且只编译sum()
-XX:+PrintAssembly:输出反汇编内容
可视化工具:
1. JConsole
基于JMX的可视化监视、管理工具
JDK1.5开始提供
启动:
JDK/bin/jconsole.exe
例:
“内存”页签,相当于可视化jstate命令,监视虚拟机内存(堆和永久代)变化趋势“线程”页签,相当于可视化jstack命令,分析线程停顿情况
2. VisualVM(All-in-One Java Troubleshooting Tool)
多合一故障处理工具
JDK1.6Update7首次发布,目前为止随JDK发布的功能最强大的运行监视和故障处理程序,未来一段时间官方主力发展的虚拟机故障处理工具
除运行监视、故障处理外,提供性能分析(Profiling)功能,性能分析功能甚至比JProfiler、YourKit等专业且收费的Profiling工具都不会逊色多少
JDK1.6之前的平台需打开-Dcom.sun.management.jmxremote参数才可被VisualVM管理
很大的优点:
不需被监视程序基于特殊Agent运行,故对应用程序实际性能影响很小,可直接应用在生产环境中。此优点JProfiler、YourKit等无法媲美
官网:
通过插件扩展支持VisualVM可做到:
1) 显示虚拟机进程及进程配置、环境信息(jps、jinfo)
2) 监视应用程序CPU、GC、堆、方法区及线程的信息(jstat、jstack)
3) dump及分析堆转储快照(jmap、jhat)
4) 方法级程序运行性能分析,找出被调用最多、运行时间最长的方法
5) 离线程序快照:收集程序运行时配置、线程dump、内存dump等信息建立一个快照,可将快照发送给开发者进行Bug反馈
插件安装方法:
1) 手工安装(不常用),在插件中心(http://Visualvmjava.net/pluginscenters.html)下载*.nbm包,点击“工具”→“插件”→“已下载”,在弹出的对话框中指定nbm包路径即可安装,插件安装后存放在JDK_HOME/lib/visualvm/visualvm路径下
2) 自动安装(可找到大多数所需插件),点击“工具”→“插件菜单”,弹出插件页签,在“可用插件”页签选中插件,奠基“安装”按钮即可安装
例: