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

11 篇文章 0 订阅

正文

一、JDK 的命令行工具

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

名称主要作用
jpsJVM Process Status Tool,显示正在运行的虚拟机进程
jstatJVM Statistics Monitoring Tool,收集虚拟机各方面的运行数据
jinfoConfiguration Info for Java,显示虚拟机配置信息
jmapMemory Map for Java,生成虚拟机的内存转储快照(heapdump 文件)
jhatJVM Heap Dump Browser,用于分析 heapdump 文件,它会建立一个 HTTP/HTML 服务器,可在浏览器上查看分析结果
jstackStack 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

在这里插入图片描述

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

在这里插入图片描述

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

(2)内存监控

在这里插入图片描述

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

(3)线程监控

在这里插入图片描述

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

2、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 执行时间分析以及内存分析。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值