基础故障处理工具
- 商业授权工具:主要是JMC(java mission control) 及它要使用到的JFR(Java Flight Recorder),JMC这个原本来自于JRockit的运维监控套件,11之前都无需独立下载,但是商业环境中使用它是需要付费的。
- 正式支持工具:者一类工具属于被长期支持的工具,不同平台、不同版本的JDK之间,这类工具可能会略有差异,但是不会出现某一个工具突然消失的情况。
- 是线性工具:这一类工具在他们的使用说明中被声明为没有技术支持,并且是实验性质的产品。
JPS虚拟机进行状况工具
jps可以列出正在运行的虚拟机进程,并现实虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID。
jps命令格式 jps [options] [hostid]
jps 执行演示
jps -l
17544 sun.tools.jps.Jps
选项 | 作用 |
---|---|
-q | 只输出LVMID,省略主类的名称 |
-m | 输出虚拟机进程启动时传递给主类main()函数的参数 |
-l | 输出主类的全名,如果进程执行的时JAR包,则输出JAR路径 |
-v | 输出虚拟机进程启动时的JVM参数 |
jstat(JVM Statistics Monitoring Tool):虚拟机统计信息监视工具
用于监视虚拟机各种运行状态信息的命令工具,它可以现实本地或者远程虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据,在没有GUI图形界面、只提供了纯文本控制台环境的服务器上,它僵尸运行期定位虚拟机性能问题的常用工具。
jstat命令格式
jstat [ option vmid [ interval [ s | ms ] [ count ]] ]
jinfo(Configuration Info For Java):Java配置信息工具
实时查看和调整虚拟机各项参数。
命令格式
jinfo [ option ] pid
执行样例
jinfo -flag CMSInitiationOccupancyFraction 1444
-XX:CMSInitiationOccupancyFraction=85
jamp(Memory Map for Java):Java内存映像工具
用于生成堆转储快照。
jmap 命令格式
jmap [ option ] vmid
选项 | 作用 |
---|---|
-dump | 生成Java堆转储快照。格式为 -dump:[live,]format=b,file=,其中live子参数说明是否只dump出存活的对象。 |
-finalizerinfo | 现实在F-Queue中等待Finalizer线程执行finalize方法的对象。只在Linux/Solaris平台有效 |
-heap | 现实Java堆详细信息,如使用哪种回收器、参数配置、分代状况等。只在Linux/Solaris平台有效 |
-histo | 现实堆中对象统计信息、包括类、实例数量、合计容量 |
-permstat | 以ClassLoader为统计口径现实永久代内存状况, |
-F | 当虚拟机进程堆-dump选项没有响应时,可使用这个选项强制生成dump快照。 |
jhat(JVM Heap Analysis Toll):虚拟机堆转储快照分析工具
JDK提供jhat(JVM Heap Analysis Tool)命令与jmap搭配使用,来分析jmap生成的堆转储快照。 jhat内置了一个微型的HTTP/Web服务器,生成堆转储快照的分析结果后,可以在浏览器中查看。不过 实事求是地说,在实际工作中,除非手上真的没有别的工具可用,否则多数人是不会直接使用jhat命令 来分析堆转储快照文件的,主要原因有两个方面。一是一般不会在部署应用程序的服务器上直接分析 堆转储快照,即使可以这样做,也会尽量将堆转储快照文件复制到其他机器[1]上进行分析,因为分析 工作是一个耗时而且极为耗费硬件资源的过程,既然都要在其他机器上进行,就没有必要再受命令行 工具的限制了。另外一个原因是jhat的分析功能相对来说比较简陋,后文将会介绍到的VisualVM,以 及专业用于分析堆转储快照文件的Eclipse Memory Analyzer、IBM HeapAnalyzer[2]等工具,都能实现 比jhat更强大专业的分析功能。代码清单4-3演示了使用jhat分析上一节采用jmap生成的Eclipse IDE的内 存快照文件。
jstack(Stack Trace for Java):Java堆栈跟踪工具
生成虚拟机当前时刻的县城快照。
jstack命令格式
jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者 javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的 目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂 起等,都是导致线程长时间停顿的常见原因。线程出现停顿时通过jstack来查看各个线程的调用堆栈, 就可以获知没有响应的线程到底在后台做些什么事情,或者等待着什么资源。
jstack [option ] vmid
选项 | 作用 |
---|---|
-F | 强制输出 |
-l | 出堆栈外,显示关于锁的附加信息 |
-m | 如果调用到本地方法的话,可以先式C/C++的堆栈 |
可视化故障处理工具
JHSDB
DK中提供了JCMD和JHSDB两个集成式的多功能工具箱,它们不仅整合了上面介绍到的所有 基础工具所能提供的专项功能,而且由于有着“后发优势”,能够做得往往比之前的老工具们更好、更强大。
JHSDB是一款基于服务性代理(Serviceability Agent,SA)实现的进程外调试工具。服务性代理是 HotSpot虚拟机中一组用于映射Java虚拟机运行信息的、主要基于Java语言(含少量JNI代码)实现的 API集合。服务性代理以HotSpot内部的数据结构为参照物进行设计,把这些C++的数据抽象出Java模 型对象,相当于HotSpot的C++代码的一个镜像。通过服务性代理的API,可以在一个独立的Java虚拟 机的进程里分析其他HotSpot虚拟机的内部数据,或者从HotSpot虚拟机进程内存中dump出来的转储快 照里还原出它的运行状态细节。服务性代理的工作原理跟Linux上的GDB或者Windows上的Windbg是相 似的。
JConsole:Java监视与管理控制台
JConsole(Java Monitoring and Management Console)是一款基于JMX(Java Manage-ment Extensions)的可视化监视、管理工具。它的主要功能是通过JMX的MBean(Managed Bean)对系统进 行信息收集和参数动态调整。JMX是一种开放性的技术,不仅可以用在虚拟机本身的管理上,还可以 运行于虚拟机之上的软件中,典型的如中间件大多也基于JMX来实现管理与监控。虚拟机对JMX MBean的访问也是完全开放的,可以使用代码调用API、支持JMX协议的管理控制台,或者其他符合 JMX规范的软件进行访问。
启动JConsole 通过JDK/bin目录下的jconsole.exe启动JCon-sole后,会自动搜索出本机运行的所有虚拟机进程,而不需要用户自己使用jps来查询。
- “概述”页签里显示的是整个虚拟机主要运行数据的概览信息,包括“堆内存使用情况”“线 程”“类”“CPU使用情况”四项信息的曲线图,这些曲线图是后面“内存”“线程”“类”页签的信息汇总。
- “内存”页签的作用相当于可视化的jstat命令,用于监视被收集器管理的虚拟机内存的变化趋势。
- “线程”页签的功能就相当于可视化 的jstack命令了,遇到线程停顿的时候可以使用这个页签的功能进行分析。前面讲解jstack命令时提到 线程长时间停顿的主要原因有等待外部资源(数据库连接、网络资源、设备资源等)、死循环、锁等 待等