《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》笔记 - 自动内存管理机制(虚拟机性能监控与故障处理工具)
虚拟机性能监控与故障处理工具
1、概述
给一个系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。这里说的数据包括:运行日志、异常堆栈、 GC 日志、线程快照( threaddump/ javacore 文件)、堆转储快照( heapdump/ hprof 文件)等。
2、JDK的命令行工具
如果读者在工作中需要监控运行于 JDK 1. 5 的虚拟机之上的程序,在程序启动时请添加参数"- Dcom. sun. management. jmxremote" 开启 JMX 管理功能,否则由于部分工具都是基于 JMX( 包括 4. 3 节介绍的可视化工具),它们都将会无法使用,如果被监控程序运行于 JDK 1. 6 的虚拟机之上,那 JMX 管理默认是开启的。
2.1、jsp: 虚拟机进程状况工具
jps的功能也和 ps 命令类似:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类( Main Class, main() 函数所在的类)名称以及这些进程的本地虚拟机唯一 ID。
jps -l
选项说明
2.2、jstat: 虚拟机统计信息监视工具
jstat可以显示本地或者远程[ 1] 虚拟机进程中的类装载、内存、垃圾收集、 JIT 编译等运行数据
jstat -gcutil 2764
选项说明
2.3、jinfo: Java配置信息工具
jinfo( Configuration Info for Java) 的作用是实时地查看和调整虚拟机各项参数。
JDK1.6以上版本java- XX:+ PrintFlagsFinal 查看参数默认值也是一个很好的选择
jinfo 还可以使用- sysprops 选项把虚拟机进程的 System. getProperties() 的内容打印出来
使用- flag[+|-] name 或者- flag name= value 修改一部分运行期可写的虚拟机参数值。
jinfo -flag CMSInitiatingOccupancyFraction 1444
2.4、jmap: Java内存映象工具
jmap( Memory Map for Java)命令用于生成堆转储快照。
-XX:+HeapDumpOnOutOfMemoryError 参数,可以让虚拟机在 OOM 异常出现之后自动生成 dump 文件,通过- XX:+ HeapDumpOnCtrlBreak 参数则可以使用[ Ctrl]+[ Break] 键让虚拟机生成 dump 文件,又或者在 Linux 系统下通过 Kill- 3 命令发送进程退出信号“吓唬”一下虚拟机,也能拿到 dump 文件。
jmap [option] vmid
选项说明
使用 jmap 生成一个正在运行的 Eclipse 的 dump 快照文件的例子:
jmap -dump:format=b, file=eclipse.bin 3500
2.5、jhat: 虚拟机堆转储快照分析工具
一般都不会去直接使用 jhat 命令来分析 dump 文件。
2.6、jstack: Java堆栈跟踪工具
jstack( Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照
生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。线程出现停顿的时候通过 jstack 来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者等待着什么资源。
jstack[ option] vmid
选项说明
在实际项目中不妨调用这个方法做个管理员页面,可以随时使用浏览器来查看线程堆栈。
查看线程状况的JSP页面
2.7、HSDIS: JIT生成代码反汇编
随着技术的发展,高性能虚拟机真正的细节实现方式已经渐渐与虚拟机规范所描述的内容产生了越来越大的差距,虚拟机规范中的描述逐渐成了虚拟机实现的“概念模型”。
HSDIS的作用是让 HotSpot 的- XX:+ PrintAssembly 指令调用它来把动态生成的本地代码还原为汇编代码输出,同时还生成了大量非常有价值的注释。
3、JDK的可视化工具
3.1、JConsole: Java监视与管理控制台
3.2、VisualVM: 多合一故障处理工具
3、本章小结