总结自《深入理解Java虚拟机》第2版
JDK的命令行工具
一、jps:虚拟机进程状况工具
它的命名和功能都和UNIX的ps命令类似,可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)。
其他的JDK工具大多需要输入它查询到的LVMID来确定要监控的是哪一个虚拟机进程。对于本地虚拟机进程来说,LVMID与操作系统的进程ID是一致的。
jps可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,hostid为RMI注册表中注册的主机名。
二、jstat:虚拟机统计信息监视工具
jstat(JVM Statistics Monitoring Tool):用于监视虚拟机各种运行状态信息。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
三、jinfo:Java配置信息工具
jinfo(Configuration Info for Java)的作用是实时查看和调整虚拟机各项参数。
四、jmap: Java内存映像工具
jmap(Memory Map for Java):用于生成堆转储快照。它可以获取dump文件,还可以查询finalize执行队列、Java堆和永久代的详细信息,如空间使用率,当前用的是哪种收集器等。
五、jhat:虚拟机堆转储快照分析工具
JVM Heap Analysis Tool:用来分析jmap生成的堆转储快照。jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,可以在浏览器中查看。不过通常不直接使用它来分析dump文件,因为分析工作是个耗时而且消耗硬件资源的过程,尽量将dump文件复制到其他机器进行分析。因此也就没必要用命令行工具了。此外,它的分析功能相对简陋。
六、jstack:Java堆栈跟踪工具
Stack Trace for Java:用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间爱停顿的常见原因。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者等待着什么资源。
七、HSDIS:JIT生成代码反汇编
HSDIS是一个sun官方推荐的HotSpot虚拟机JIT编译代码的反汇编插件,它包含在HotSpot虚拟机的源码之中,但没有提供编译后的程序。它的作用是让HotSpot的-XX:+PrintAssembly指令调用它来把动态生成的本地代码还原为汇编代码输出,同时还生成了大量非常有价值的注释,这样我们就可以通过输出的代码来分析问题。
JDK的可视化工具
一、JConsole:Java监视与管理控制台
JConsole(Java Monitoring and Management Console)是一种基于JMX的可视化监视、管理工具。它管理部分的功能是针对JMX MBean进行管理,MBean可以使用代码、中间件服务器的管理控制台或者所有符合JMX规范的软件进行访问。
1.启动JConsole
JDK/bin目录下的“jconsole.exe”启动JConsole后,将自动搜索出本机运行的所有虚拟机进程,不需要用户再使用jsp来查询了。它的主界面有6个页签:概述、内存、线程、类、VM摘要、MBean。
2.内存监控
内存页签相当于可视化的jstat命令,用于监视受收集器管理的虚拟机内存(Java堆和永久代)的变化趋势。
3.线程监控
线程页签的功能相当于可视化的jstack命令,遇到线程停顿时可以使用这个页签进行监控分析。线程长时间停顿的主要原因有:等待外部资源(数据库连接、网络资源、设备资源等)、死循环、锁等待(活锁和死锁)。
二、VisualVM:多合一故障处理工具
VisualVM(All-in-One Java Troubleshooting Tool)
它除了运行监视、故障处理外,还提供了其他方面功能:如性能分析。它还有一个很大的优点:不需要被监视的程序基于特殊Agent运行,因此它对应用程序的实际性能的影响很小,使得它可以直接应用在生产环境中。
1.VisualVM兼容范围与插件安装
VisualVM基于NetBeans平台开发,因此它一开始就具备了插件扩展功能的特性,通过插件扩展支持,VisualVM可以做到:
- 显示虚拟机进程以及进程的配置、环境信息(jps、jinfo)
- 监视应用程序的CPU、GC、堆、方法区以及线程过的信息(jstat,jstack)
- dump以及分析堆转储快照(jmap,jhat)
- 方法级的程序运行性能分析,找出被调用最多、运行时间最长的方法
- 离线程序快照:收集程序的运行时配置、线程dump、内存dump等信息建立一个快照,可以将快照发送开发者进行Bug反馈
2.生成、浏览堆转储快照
3.分析程序性能
在Profile页签中,VisualVM提供了程序运行期间方法级的CPU执行时间分析以及内存分析,做Profiling分析肯定会对程序运行性能有比较大的影响,所以一般不在生产环境中使用这项功能。
4.BTrace动态日志跟踪
它的作用是在不停止目标程序运行的前提下,通过HotSpot虚拟机的HotSwap技术动态加入原本并不存在的调试代码。BTrace的用法还有许多,打印调用堆栈、参数、返回值只是最基本的应用,还可以进行性能监视、定位连接泄露和内存泄露、解决多线程竞争问题等。