概述

给一个系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。
这里说的数据包括但不限于异常堆栈、虚拟机运行日志、垃圾收集器日志、线程快照(threaddump/javacore文件)、
堆转储快照(heapdump/hprof文件)等。恰当地使用虚拟机故障处理、分析的工具可以提升我们分析数据、定位并解决问题的效率,
但我们在学习工具前,也应当意识到工具永远都是知识技能的一层包装,没有什么工具是“秘密武器”,拥有了就能“包治百病”。

控制台监控工具

1 jps: JVM 进程状况工具

可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(LVMID,LocalVirtual Machine Identifier)。

java visualvm监控jetty jvm常用的监控和调试工具_应用程序

查看JVM启动时显式指定的参数:

java visualvm监控jetty jvm常用的监控和调试工具_JVM_02

jps 主要选项为:

java visualvm监控jetty jvm常用的监控和调试工具_JVM_03

2 jstat:虚拟机统计信息监视工具

jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具。
它可以显示本地或者远程[插图]虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据。

查看堆内存使用情况:

java visualvm监控jetty jvm常用的监控和调试工具_应用程序_04

查看堆内存使用总结:

java visualvm监控jetty jvm常用的监控和调试工具_Java_05

其余选项功能如下:

java visualvm监控jetty jvm常用的监控和调试工具_应用程序_06

3 jinfo:Java配置信息工具
jinfo(Configuration Info for Java)的作用是实时查看和调整虚拟机各项参数。
使用-flag选项可以查看JVM 未被显式指定的参数列表,使用-sysprops选项把JVM进程的System.getProperties()内容打印出来。
JDK 6之后,jinfo加入了在运行期修改部分参数值的能力(可以使用-flag[+|-]name或者-flag name=value在运行期修改一部分运行期可写的虚拟机参数值)

查看JVM默认参数列表:

java visualvm监控jetty jvm常用的监控和调试工具_应用程序_07

4 jmap:Java内存映像工具

jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文件)。

java visualvm监控jetty jvm常用的监控和调试工具_应用程序_08

分析堆和方法区的详细信息:

java visualvm监控jetty jvm常用的监控和调试工具_JVM_09

jmap工具主要选项如下:

java visualvm监控jetty jvm常用的监控和调试工具_Java_10

5 jstack:Java堆栈跟踪工具

jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。

线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的通常是定位线程出现长时间停顿的原因

如线程间死锁、死循环、请求外部资源导致的长时间挂起等。

查看线程快照:

java visualvm监控jetty jvm常用的监控和调试工具_Java_11


jstack工具主要选项如下:

java visualvm监控jetty jvm常用的监控和调试工具_应用程序_12

也可以直接在程序中通过Thread.getAllStackTraces()方法用于获取虚拟机中所有线程的StackTraceElement对象。
在项目中可调用这个方法再配个管理员页面,如此便可以更加方便直观查看线程堆栈。

图形化监控工具

VisualVM:多合-故障处理工具

1 VisualVM兼容范围与插件安装
VisualVM基于NetBeans平台开发工具,所以一开始它就具备了通过插件扩展功能的能力,有了插件扩展支持,VisualVM可以做到:

  • 显示虚拟机进程以及进程的配置、环境信息(jps、jinfo)。
  • 监视应用程序的处理器、垃圾收集、堆、方法区以及线程的信息(jstat、jstack)。
  • dump以及分析堆转储快照(jmap、jhat)。
  • 方法级的程序运行性能分析,找出被调用最多、运行时间最长的方法。
  • 离线程序快照:收集程序的运行时配置、线程dump、内存dump等信息建立一个快照,可以将快照发送开发者处进行Bug反馈。
  • 其他插件带来的无限可能性。

2 生成、浏览堆转储快照

在VisualVM中生成堆转储快照文件有两种方式,可以执行下列任一操作:在“应用程序”窗口中右键单击应用程序节点,然后选择“堆Dump”。

在“应用程序”窗口中双击应用程序节点以打开应用程序标签,然后在监视标签中单击堆Dump。

生成堆转储快照文件之后,应用程序页签会在该堆的应用程序下增加一个以[heap-dump]开头的子节点,并且在主页签中打开该转储快照,如下图所示。

java visualvm监控jetty jvm常用的监控和调试工具_JVM_13

如果需要把堆转储快照保存或发送出去,就应在heapdump节点上右键选择“另存为”菜单,否则当VisualVM关闭时,生成的堆转储快照文件会被当作临时文件自动清理掉。
要打开一个由已经存在的堆转储快照文件,通过文件菜单中的“装入”功能,选择硬盘上的文件即可。

3 分析程序性能
在Profiler页签中,VisualVM提供了程序运行期间方法级的处理器执行时间分析以及内存分析。
做Profiling分析肯定会对程序运行性能有比较大的影响,所以一般不在生产环境使用这项功能,或者改用JMC来完成,JMC的Profiling能力更强,对应用的影响非常轻微。
要开始性能分析,先选择“CPU”和“内存”按钮中的一个,然后切换到应用程序中对程序进行操作,VisualVM会记录这段时间中应用程序执行过的所有方法。
如果是进行处理器执行时间分析,将会统计每个方法的执行次数、执行耗时如果是内存分析,则会统计每个方法关联的对象数以及这些对象所占的空间
等要分析的操作执行结束后,点击“停止”按钮结束监控过程。

4 BTrace动态日志跟踪
BTrace是一个很神奇的VisualVM插件,它本身也是一个可运行的独立程序。
BTrace的作用是在不中断目标程序运行的前提下,通过HotSpot虚拟机的Instrument功能动态加入原本并不存在的调试代码
这项功能对实际生产中的程序很有意义:如当程序出现问题时,排查错误的一些必要信息时(譬如方法参数、返回值等),
在开发时并没有打印到日志之中以至于不得不停掉服务时,都可以通过调试增量来加入日志代码以解决问题。

BTrace的用途很广泛,打印调用堆栈、参数、返回值只是它最基础的使用形式,在它的网站上有使用BTrace进行性能监视、定位连接泄漏、内存泄漏、解决多线程竞争问题等的使用案例。
BTrace能够实现动态修改程序行为,是因为它是基于Java虚拟机的Instrument开发的。Instrument是Java虚拟机工具接口(Java Virtual Machine ToolInterface,JVMTI)的重要组件,
提供了一套代理(Agent)机制,使得第三方工具程序可以以代理的方式访问和修改Java虚拟机内部的数据

以上均在JDK8环境下进行。