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

本贴最后更新于 1804 天前,其中的信息可能已经渤澥桑田

正文

一、JDK 的命令行工具

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

名称 主要作用
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,显示虚拟机的快照进程

1、jps:虚拟机进程状况工具

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

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: 也不知道是不是我的打开方式不对,在 Win7、Win10 下用 JDK1.6、1.7、1.8 测试时,输出的是 Jar 文件名,而不是 Jar 路径。

2、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 编译的方法

3、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() 的内容
显示所有虚拟机参数及系统变量

4、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 快照

5、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 即可查看分析结果。

6、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++ 的堆栈

二、JDK 的可视化工具

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

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

(1)启动 JConsole

15765952061.jpg

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

15765959351.jpg

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

(2)内存监控

15765959981.jpg

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

(3)线程监控

15765962111.jpg

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

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

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

(1)启动 VisualVM

15765984351.jpg

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

15765975581.jpg

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

(2)运行监视

15765977651.jpg

15765977871.jpg

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

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

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

  • 右键单击应用程序节点,选择“堆 Dump”。
    15765999761.jpg
  • 在“监视”页签中单击“堆 Dump”。
    15765998851.jpg

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

(4)分析程序性能

15765980541.jpg

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

  • 阅读
    85 引用 • 242 回帖 • 4 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 3 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...