深机笔记 - 08 虚拟机性能监控及故障处理工具

时间:2021-05-07 12:42:03
《深入理解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]
选项: 深机笔记 - 08 虚拟机性能监控及故障处理工具
例:
jps -l

2. jstat(JVM Statistics Monitoring Tool)

虚拟机统计信息监视工具,监视虚拟机各种运行状态信息,可显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据 无GUI图形界面服务器运行期定位虚拟机性能问题的首选工具 命令格式:
jstat [option vmid [interval [s|ms] [count] ] ] interval 查询间隔,count 查询次数,若省略这两个参数则只查询一次
选项: 深机笔记 - 08 虚拟机性能监控及故障处理工具
例:
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
选项: 深机笔记 - 08 虚拟机性能监控及故障处理工具
例:
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
选项: 深机笔记 - 08 虚拟机性能监控及故障处理工具
例:
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
例: 深机笔记 - 08 虚拟机性能监控及故障处理工具
“内存”页签,相当于可视化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等无法媲美
官网:
https://visualvm.github.io/
通过插件扩展支持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) 自动安装(可找到大多数所需插件),点击“工具”→“插件菜单”,弹出插件页签,在“可用插件”页签选中插件,奠基“安装”按钮即可安装 例: 深机笔记 - 08 虚拟机性能监控及故障处理工具