《深刻理解 Java 虚拟机》读书笔记:虚拟机性能监控与故障处理工具

正文

1、JDK 的命令行工具

JDK 的 bin 目录下提供了一些用于监视虚拟机和故障处理的命令行工具。java

名称 主要做用
jps JVM Process Status Tool,显示正在运行的虚拟机进程
jstat JVM Statistics Monitoring Tool,收集虚拟机各方面的运行数据
jinfo Configuration Info for Java,显示虚拟机配置信息
jmap Memory Map for Java,生成虚拟机的内存转储快照(heapdump 文件)
jhat JVM Heap Dump Browser,用于分析 heapdump 文件,它会创建一个 HTTP/HTML 服务器,可在浏览器上查看分析结果
jstack Stack Trace for Java,显示虚拟机的快照进程

一、jps:虚拟机进程情况工具

jps 做用:
列出正在运行的虚拟机进程,并显示虚拟机进程执行主类(main() 函数所在的类)名称以及进程的本地虚拟机惟一 ID(Local Virtual Machine Identifier,LVMID)。对于本地虚拟机进程,LVMID 与操做系统进程 ID(PID)一致。apache

jps 命令格式:浏览器

jps [options] [hostid]
  • options:选项,可多个。
  • hostid:jps 能够经过 RMI 协议查询开启了 RMI 服务的远程虚拟机进程状态,hostid 为 RMI 注册表中注册的主机名。

jps 执行样例:服务器

root@█████████:~# jps -l
16657 halo-latest.jar
20498 org.apache.catalina.startup.Bootstrap
16669 sun.tools.jps.Jps

jps 选项:函数

选项 做用
-q 只输出 LVMID,省略主类的名称
-m 输出虚拟机进程启动时,传递给主类 main() 函数的参数
-l 输出主类的全名,若是进程执行的是 Jar 包,输出 Jar 路径
-v 输出虚拟机进程启动时 JVM 参数

PS: 也不知道是否是个人打开方式不对,在 Win七、Win10 下用 JDK1.六、1.七、1.8 测试时,输出的是 Jar 文件名,而不是 Jar 路径。工具

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

jstat 做用:
用于监视虚拟机各类运行状态信息。能够显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据。性能

jstat 命令格式:测试

jstat <option> <vmid> [interval[s|ms] [count]]
  • option:选项,表明用户但愿查询的虚拟机信息,主要分为 3 类:类装载、垃圾收集、运行期编译情况。
  • vmid:虚拟机惟一 ID(VMID),若是是本地虚拟机进程,那么 VMID 与 LVMID 一致,若是是远程虚拟机进程,那么 VMID 的格式为:[protocol:][//]lvmid[@hostname][:port]/servername
  • interval:查询间隔。
  • count:查询次数。同时省略 interval 和 count 时,表示只查询一次。

jstat 执行样例:操作系统

root@█████████:~# jstat -gcutil 20498
 S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
 14.14   0.00  91.33  96.52  96.90  93.32   1210    7.328     6    0.536    7.864

jstat 选项:插件

选项 做用
-class 显示类装载、卸载数量、总空间以及类装载所耗费的时间
-gc 显示 Java 堆情况,包括各个区域的容量、已用空间、GC 时间合计等
-gccapacity 显示 Java 堆各个区域的最大、最小(初始化)容量
-gcutil 显示 Java 堆各个区域的已使用空间占总空间的百分比
-gccause 与 -gcutil 功能同样,但会额外输出致使上一次 GC 产生的缘由
-gcnew 显示新生代 GC 情况
-gcnewcapacity 显示新生代最大、最小(初始化)容量
-gcold 显示老年代 GC 情况
-gcoldcapacity 显示老年代最大、最小(初始化)容量
-gcpermcapacity 显示永久代最大、最小(初始化)容量
-compiler 显示 JIT 编译器编译过的方法、耗时等信息
-printcompilation 显示已被 JIT 编译的方法

三、jinfo:Java 配置信息工具

jinfo 做用:
实时地查看和调整虚拟机各项参数。

jinfo 命令格式:

jinfo [option] <pid>
  • option:选项。
  • pid:虚拟机进程 ID。

jinfo 执行样例:

root@█████████:~# jinfo -flag MaxHeapSize 20498
-XX:MaxHeapSize=260046848

jinfo 选项:

选项 做用
-flag <name> 显示指定 name 的虚拟机参数
-flag [+|-]<name> 启用或禁用指定 name 的虚拟机参数
-flag <name>=<value> 设置指定 name 的虚拟机参数值
-flags 显示全部的虚拟机参数
-sysprops 显示虚拟机进程的系统变量,即 System.getProperties() 的内容
显示全部虚拟机参数及系统变量

四、jmap:Java 内存映像工具

jmap 做用:
主要用于生成堆转储快照(通常称为 heapdump 或 dump 文件)。除此以外,还能够查询 finalize 执行队列、Java 堆和永久代的详细信息。

jmap 命令格式:

jmap [option] <vmid>
  • option:选项。
  • vmid:虚拟机进程惟一 ID。

jmap 执行样例:

root@█████████:~# jmap -dump:format=b,file=test.bin 20498
Dumping heap to /root/test.bin ...
Heap dump file created

jmap 选项:

选项 做用
-dump 生成 Java 堆转储快照。格式为:-dump:[live,]format=b,file=<filename>,live 子参数表示是否只 dump 出存活的对象
-finalizerinfo 显示在 F-Queue 中等待 Finalizer 线程执行 finalize 方法的对象
-heap 显示 Java 堆详细信息,如使用哪一种回收器、参数配置、分代情况等
-histo 显示堆中对象统计信息,包括类、实例数量、合计容量
-permstat 以 ClassLoader 为统计口径显示永久代内存情况,JDK1.8 改成 -clstats
-F 当虚拟机进程对 -dump 选项没有响应时,可以使用该选项强制生成 dump 快照

五、jhat:虚拟机堆转储快照分析工具

jhat 做用:
用于分析 jmap 生成的堆转储快照。jhat 内置了一个微型的 HTTP/HTML 服务器,生成 dump 文件分析结果后,可在浏览器中查看。

jhat 命令格式:

jhat [option] <file>
  • option:选项。
  • file:堆转储快照文件。

jhat 执行样例:

root@█████████:~# jhat test.bin 
Reading from test.bin...
Dump file created Tue Dec 17 21:49:26 CST 2019
Snapshot read, resolving...
Resolving 979375 objects...
Chasing references, expect 195 dots...................................................................................................................................................................................................
Eliminating duplicate references...................................................................................................................................................................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

在浏览器中输入 http://IP地址:7000 便可查看分析结果。

六、jstack:Java 堆栈跟踪工具

jstack 做用:
用于生成虚拟机当前时刻的线程快照(通常称为 threaddump 或 javacore 文件)。线程快照是当前虚拟机内每一条线程正在执行的方法堆栈的集合。

生成线程快照的主要目的是定位线程出现长时间停顿的缘由。当线程出现停顿时,经过 jstack 查看各个线程的调用堆栈,就能够知道没有响应的线程到底在后台作些什么事情,或者等待着什么资源。

jstack 命令格式:

jstack [option] <vmid>
  • option:选项。
  • vmid:虚拟机进程惟一 ID。

jstack 执行样例(部分结果):

root@█████████:~# jstack -l 20498
2019-12-17 22:08:31
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.141-b15 mixed mode):

"Attach Listener" #7966 daemon prio=9 os_prio=0 tid=0x00007f0a54037800 nid=0xf15 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
    - None 
 ...

jstack 选项:

选项 做用
-F 当正常输出的请求不被响应时,强制输出线程堆栈
-l 除堆栈外,显示关于锁的附加信息
-m 若是调用到本地方法的话,能够显示 C/C++ 的堆栈

2、JDK的可视化工具

JDK 提供了两个功能强大的可视化工具:JConsole 和 VisualVM。

一、JConsole:Java 监视与管理控制台

(1)启动 JConsole

经过 JDK/bin 目录下的“jconsole.exe”启动 JConsole 后,将自动搜索出本机运行的全部虚拟机进程,不须要用户本身使用 jps 查询。双击选择其中一个进程便可开始监控,也可以使用“远程进程”功能来链接远程服务器,对虚拟机进行监控。

“概述”页签显示的是整个虚拟机主要运行数据的概览。

(2)内存监控

“内存”页签至关于可视化的 jstat 命令,用于监视受收集器管理的虚拟机内存的变化趋势。

(3)线程监控

“线程”页签至关于可视化的 jstack 命令,遇到线程停顿时可以使用该页签进行监控分析。

二、VisualVM:多合一故障处理工具

VisualVM 除了默认提供的监视、线程等功能外,还能够安装扩展插件来集成更多功能。

(1)启动 VisualVM

经过 JDK/bin 目录下的“jvisualvm.exe”启动 VisualVM 后,选择一个须要监视的程序便可进入主界面。

“概述”页签用于显示虚拟机进程以及进程的配置、环境信息(jps、jinfo)。

(2)运行监视

“监视”页签和“线程”页签,用于监视应用程序的 CPU、内存、类以及线程的信息(jstat、jstack)。

(3)生成、浏览堆转储快照

在 VisualVM 中生成 dump 文件有两种方式:

  • 右键单击应用程序节点,选择“堆 Dump”。

  • 在“监视”页签中单击“堆 Dump”。

生成 dump 文件后,将在应用程序下增长一个以 [heapdump] 开头的子节点,而且在主页签中打开该转储快照。若是须要保存 dump 文件,要在 heapdump 节点上右键选择“另存为”。不然当 VisualVM 关闭时,生成的 dump 文件也会被删除掉。

(4)分析程序性能

“Profiler”页签中,VisualVM 提供了程序运行期间方法级的 CPU 执行时间分析以及内存分析。

相关文章
相关标签/搜索