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

正文

一、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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容