1. 概述
理论总是作为指导实践的工具,能把这些知识应用到实际工作中才是我们的最终目的。
给系统定位问题的时候,
知识、经验是关键基础,
数据是依据,
工具是运用知识处理数据的手段。
这里说的数据包括:
- 运行日志
- 异常堆栈
- GC日志
- 线程快照(threaddump/javacore文件)
- 堆转储快照(heapdump/hprof文件)
工具永远都是知识技能的一层包装。
2. JDK的命令工具
JDK的bin目录下除“java”,“javac”的工具。
如果在工作中需要监控运行于JDK1.5的虚拟机上的程序,在程序启动时请添加参数
-Dcom.sun.management.jmxremote
开启JMX管理功能,否则由于部分工具都是基于JMX,它都将无法使用,如果被监控程序运行于JDK1.6的虚拟机之上,那JMX管理默认是开启的,虚拟机启动时无须再添加任何参数。
Sun JDK 监控和故障处理工具
名称 | 主要作用 |
---|---|
jps | JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程 |
jstat | JVM Statistics Monitoring Tool,用于收集HotSpot虚拟机各方面的运行数据 |
jinfo | Configuration Info for Java,显示虚拟机配置信息 |
jmap | Memory Map for Java,生成虚拟机的内存转储快照(heapdump文件) |
jhat | JVM Heap Dump Browser,用于分析heapdump 文件,它会建立一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果 |
jstack | Stack Trace for Java,显示虚拟机的线程快照 |
1.jps:虚拟机进程状况工具
JDK的很多小工具的名字都参考了UNIX命令的全名方式。
jps(JVM Process Status Tool) 是其中的典型。
除了名字像UNIX的ps命令之外,它的功能也和ps命令类似:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class, main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)。
jps是使用频率最高的JDK命令行工具,因为其它的JDK工具大多需要输入它查询到LVMID来确定要监控的是哪一个虚拟机进程。
2.jstat:虚拟机统计信息监视工具
jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具。
它可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。
3.jinfo:Java配置信息工具
jinfo(Configuation Info for Java)的作用是实时地查看和调整虚拟机各项参数。
4.jmap:Java内存映像工具
jmap(Memory Map for Java) 命令用于生成堆转储快照(一般称为heapdump或dump文件)。
jmap 的作用并不仅仅是为了获取 dump 文件,它还可以查询 finalize执行队列,Java堆和永久代的详细信息,如空间使用率、当前用的是哪种收集器等。
5.jhat:虚拟机堆转储快照分析工具
jhat(JVM Heap Analysis Tool) 命令与jmap搭配使用,来分析jmap生成的堆转储快照。
一般来说,不会直接使用jhat命令分析dump文件,主要原因有2个:
- 一般不会在部署应用程序的服务器上直接分析dump文件,即使可以这样做,也会尽量将dump文件复制到其他机器上进行分析,因为分析工作是一个耗时而且消耗硬件资源的过程,既然都要在其他机器上进行,也就不限制使用工具了。
- 另一个原因就是jhat的分析功能相对来说比较简陋,VisualVM会更好用。
6.jstack:Java堆栈跟踪工具
jstack (Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。
线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。
线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者等待着什么资源。
7.HSDIS:JIT生成代码反汇编
HSDIS 是一个Sun官方推荐的HotSpot虚拟机JIT编译代码的反汇编插件,它包含在HotSpot虚拟机的源码之中,但没有提供编译后的程序。
在Project Kenai的网站也可以下载到单独的源码。它的作用是让HotSpot的-XX:+PrintAssembly 指令调用它来把动态生成的本地代码还原为汇编代码输出,同时还生成了大量非常有价值的注释,这样我们就可以通过输出的代码来分析问题。
3.JDK的可视化工具
JDK除了提供大量的命令行工具外,还有两个功能强大的可视化工具:
- JConsole
- VisualVM
1. JConsole:Java 监视与管理控制台
1.启动JConsole
/Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/bin
通过 JDK/bin 目录下的 jconsole 启动JConsole后,将自动搜索出本机运行的所有虚拟机进程,不需要用户自己再使用jps来查询了。
如图,双击选择其中一个进程即可开始监控,也可以使用下面的“远程进程”功能来连接远程服务器,对远程虚拟机进行监控。
2.内存监控
“内存”页签相当于可视化的jstat命令,用于监视收集器管理的虚拟机内存(Java堆和永久代)的变化趋势。
3.线程监控
“线程”页签的功能相当于可视化的jstack命令,遇到线程停顿时可以使用这个页签进行监控分析。
线程长时间停顿的主要原因主要有:
- 等待外部资源(数据库连接、网络资源、设备资源等)
- 死循环
- 锁等待(活锁和死锁)
2. VisualVM: 多合一故障处理工具
VisualVM(All-in-One Java Troubleshooting Tool)是目前为止随JDK发布的功能最强大的运行监视和故障处理程序,并且是官方主力发展的虚拟机故障处理工具。
VisualVM 还有一个很大的优点:不需要被监视的程序基于特殊Agent运行,因此它对应用程序的实际性能影响很小,使得它可以直接应用在生产环境中。
1.VisualVM兼容范围与插件安装
VisualVM基于 NetBeans平台开发,因此它一开始就具备了插件扩展功能的特性,通过插件扩展支持,VisualVM可以做到:
- 显示虚拟机进程以及进程的配置、环境信息(jps、jinfo)
- 监视应用程序的CPU、GC、堆、方法区以及线程的信息(jstat、jstack)
- dump以及分析堆栈转储快照(jmap、jhat)。
- 方法级的程序运行性能分析,找出被调用最多、运行时间最长的方法。
- 离线程序快照:收集程序的运行时配置、线程dump、内存dump等信息建立一个快照,可以将快照发送开发者处进行bug反馈。
不给VisualVM装任何插件,就相当于放弃了它最精华的功能,和没有安装任何应用软件的操作系统差不多。
插件可以进行手工安装,在相关网站上下载*.nbm包后,点击“工具”->“插件”->“已下载”菜单,然后在弹出的对话框中指定nbm包路径便可进行安装,插件安装后存放在 JDK_HOME/lib/visualvm/visualvm
中。
使用VisualVM的自动安装功能已经可以找到大多数所需的插件,在有网络连接的环境下,点击“工具”->“插件菜单”弹出的插件页签,在页签的“可用插件”中列举了当前版本VisualVM可以使用的插件。