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

说明:本篇文章是在阅读《深入理解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 的无限可能.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值