欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

虚拟机性能监控与故障处理工具

程序员文章站 2022-07-13 14:11:42
...
说明:本篇文章是在阅读《深入理解Java虚拟机》过程中的一些笔记和分析,由于本人能力有限,如果有书写错误的地方,欢迎各位大佬批评指正!我们互相交流,学习,共同进步!

该项目的地址:https://github.com/xiaoheng1/jvm-read

1.JDK的命令行工具

我们常用的工具是 java.exe 和 javac.exe 这两个,但是不知道你们有没有注意到 bin 目录下的工具其实不止这两个. 例如 xjc.exe、
wsimport.exe、wsgen.exe 等. 这些工具非常的小巧,大部分都稳定在 27KB 左右,并非 JDK 开发团队为了炫耀编程水平,故意把它们制作的如此
精炼,而是因为这些命令行工具大多数是 jdk/lib/tools.jar 类库的一层薄包装而已,它们主要的实现代码在 tools 类库中已经实现了.
假如有人使用的是 linux 版的 JDK 的话,还会发现这些工具中很多甚至就是由 shell 脚本直接写成,可以使用 vim 直接打开它们.
JDK 开发团队选择采用 Java 代码来实现这些监控工具是有特别用意的:当应用程序部署到生产环境后,无论是直接接触物理服务器,还是 telnet 到
服务器都可能会收到限制. 借助 tools.jar 类库里面的接口,我们可以直接在应用程序中实现功能强大的监控分析功能.

tools.jar 包包含:
(1)asm
(2)attach
(3)hprof
(4)jar
(5)java
(6)jps
...

如果有使用 jdk1.5 的虚拟机,那么在程序启动的时候,需要添加参数 -Dcom.sum.management.jmxremote 开启 JM 管理功能,否则部分基于
JMX 的工具无法使用. jdk1.6+ 默认开启 JMX 管理功能.

(1)jps 虚拟机进程状况工具(java process status tool)
这个工具类似于 ps 命令,可以列出正在运行的虚拟机进程,并显示这些进程的本地虚拟机唯一 ID(和 PID 是一致的)以及其主类

jps [options] [hostid]

1508 Jps
665
1502 Launcher
734 RemoteMavenServer
1503 StringGC

(2)jstat 虚拟机统计信息监视工具(JVM Statistics Monitoring Tool)
用于监视虚拟机各种运行状态信息的命令工具,它可以显示本地或远程虚拟机中的类装载、内存、垃圾收集、JIT 编译等运行数据,在没有 GUI 图形
界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具(主要查询虚拟机的类装载、垃圾收集、运行期编译状态等).

jstat [option vmid [interval[s|ms][count]]]
interval 代表查询间隔
count 代表查询次数

如果省略这两个参数,则说明只查询一次. 如果需要每 250 毫秒查询一次,一共查询 20 次则如下:
jstat -gc 2764 250 20


如果是本地虚拟机进程,则 vmid 和 lvmid 是一致的,如果是远程虚拟机进程,那么 vmid 的格式应该是:
[protocol:][//]lvmid[@hostname[:port]/servername]


(3)jinfo Java配置信息工具(Configuration Info for java)
实时查看和调整虚拟机各项参数.

jinfo [option] pid

(4)jmap Java内存映像工具(Memory Map for Java)
用于生成堆转储快照(heapdump 或 dump 文件),如果不使用这种方式,那么还有一些比较粗暴的方式,例如:-XX:+HeapDumpOnOutOfMemoryError
参数,可以让虚拟机在 OOM 异常出现后自动生成 dump 文件,通过 -XX:+HeapDumpOnCtrlBreak 参数则可以使用 ctrl + break 键让虚拟机
生成 dump 文件,又或者在 linux 系统下,通过 kill 3 命令发送进程退出信号 "吓唬" 一下虚拟机,也能拿到 dump 文件.
jmap 除了拿到 dump 文件,还能查询 finalize 执行队列、Java 堆、永久代的详细信息,如空间使用率、当前用的是那种收集器等.

jmap [option] vmid

(5)jhat 阻尼及堆转储快照分析工具(JVM Heap Analysis Tool)
该命令和 jmap 大腿使用,用来分析 jmap 生成的堆转储快照. jhat 内置了一个微型的 http/html 服务器,生成 dump 文件的分析结果后,可以
在浏览器中查看.
需要说明的是,jhat 功能比较简陋,不到万不得已,还是选择其他更好用的工具吧.

(6)jstack Java堆栈跟踪工具(Stack Trace for Java)
用于生成虚拟机当前时刻的线程快照(threaddump 或 javacore 文件). 线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成
线程快照的目的在于定位线程出现上时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等.

jstack [option] vmid

在 jdk1.5 中 java.lang.Thread 类新增了一个 getAllStackTraces() 方法用于获取虚拟机中所有线程的 StackTraceElement 对象. 使用
这个方法可以完成 jstack 的大部分功能.

(7)HSDIS JIT生成代码反汇编

待定


2.JDK的可视化工具

JConsole 和 VisualVM

(1)JConsole Java监视与管理控制台(Java Monitoring and Management Console)
是基于 JMX 的可视化监视、管理工具. 它管理部分的功能是针对 JMX MBean 进行管理,由于 MBean 可以使用代码、中间件服务器的管理控制台
或者所有符合 JMX 规范的软件进行访问,所以我们重点看下 Console 的监视部分功能.

(2)启动 JConsole
通过 jdk/bin.jconsole.exe 启动 JConsole 后,将自动搜索出本机运行的所有虚拟机进程,不需要执行 jps 来查询.
进去后,我们可以看到 概述、内存、线程、类、VM摘要 MBean 这6个页签.
概述 页签显示的是整个虚拟机主要的运行数据的概览,其中包括堆内存使用情况、线程、类、CPU使用情况 4 种信息的曲线图,这些曲线图是后面内存、
线程、类 页签的信息汇总.

内存监控 -> 相当于可视化的 jstat 命令,用于监视受收集器管理的虚拟机内存(Java堆和永久代)的变化趋势.

线程监控相当于可视化的 jstack 命令,遇到线程停顿时可以使用这个页签进行监控分析. 前面提到过线程过程时间停顿的主要原因有:等待外部资源
(数据库连接、网络连接、设备资源等)、死循环、锁等待(活锁或死锁).


VisualVM 多合一故障处理工具

VisualVM(All in One) 是到目前为止随 JDK 发布的功能最强大的运行监视和故障处理程序.

VisualVM 基于 NetBeans 平台开发,因此它一开始就具备了插件扩展功能的特性,通过插件扩展支持,VisualVM 可以做到:
1.显示虚拟机进程以及进程的配置、环境信息(jps、jinfo)
2.监视应用程序的 CPU、GC、堆、方法区以及线程的信息(jstat、jstack)
3.dump 以及分析堆转储快照(jmap、jhat)
4.方法级的程序运行性能分析,找出被调用最多、运行时间最长的方法.
5.离线程序快照:收集程序的运行时配置、线程 dump、内存 dump 等信息建立一个快照,可以将快照发送开发者进行 Bug 反馈.
6.其他 plugins 的无限可能.