jps,jstat,jstack,jmp,jinfo,jhat使用详解及JDK监控和故障处理工具

前提

JDK版本1.8.0_45
虚拟机HotSpot(TM) 64-Bit Server VM

jps:虚拟机进程状况工具

jps - Java Virtual Machine Process Status Tool用于查找运行在HotSpot虚拟机上的java进程。 该工具仅限于查找其有访问权限的JVM信息,如果A用户启动一个Java程序,B用户使用jps命令则无法查看到该进程,但通常可以通过ps -ef|grep java查看

jps工具主要选项:

  • -q :只输出进程id
  • -m :输出虚拟机进程启动时传递给main()函数的参数
  • -l :输出主类的全名,如果是jar包,则输出jar包路径
  • -v :输出虚拟机进程启动时的JVM参数

常用jps -lv 显示主类的全名,并显示JVM参数

~  jps -lv
467  -Xms128m -Xmx750m -XX:ReservedCodeCacheSize=240m
-XX:+UseCompressedOops -Dfile.encoding=UTF-8 
-XX:+UseConcMarkSweepGC 
-XX:SoftRefLRUPolicyMSPerMB=50 -ea 
-Dsun.io.useCanonCaches=false 
-Djava.net.preferIPv4Stack=true 
-Djdk.http.auth.tunneling.disabledSchemes="" 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:-OmitStackTraceInFastThrow -Xverify:none 
-XX:ErrorFile=/Users/levy/java_error_in_idea_%p.log 
-XX:HeapDumpPath=/Users/levy/java_error_in_idea.hprof 
-Djb.vmOptionsFile=/Applications/IntelliJ IDEA.app/Contents/bin/idea.vmoptions 
-Didea.java.redist=jdk-bundled 
-Didea.home.path=/Applications/IntelliJ IDEA.app/Contents 
-Didea.executable=idea 
-Didea.paths.selector=IntelliJIdea2018.2

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

jstat - Java Virtual Machine Statistics Monitoring Tool是用于监视HotSpot虚拟机各种运行状态信息的工具,它是运行期间定位虚拟机性能问题的首选工具。

jstat工具主要选项:

  • -class :监视类装载、卸载数量、总空间以及装载所耗费的时间
  • -gc :监视Java堆状况
  • -gccapacity :监视Java堆状况,主要关注各个区域使用的最大、最小空间
  • -gcutil :监视Java堆状况,主要关注已使用空间占总空间的百分比
  • -gccause :与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因
  • -gcnew :监视新生代GC状况
  • -gcnewcapacity :监视新生代GC状况,主要关注使用到的最大、最小空间
  • -gcold :监视老年代GC状况
  • -gcoldcapacity :监视老年代GC状况,主要关注使用到的最大、最小空间
  • -gcpermcapacity :输出永久代使用到的最大、最小空间
  • -compiler :输出JIT编译器编译过的方法、耗时等
  • -printcompilation :输出已经被JIT编译器编译的方法

常用jstat -gcutil 467 1000 3显示主类的全名,并显示JVM参数,其中467表示进程id号,可以通过jps命令查看;1000表示隔1000毫秒运行一次;3表示运行3次后退出。

~  jstat -gcutil 467 1000 3
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0.00  56.32  21.83  42.89  93.14  89.00    151    3.081    46   15.618   18.699
  0.00  56.32  21.83  42.89  93.14  89.00    151    3.081    46   15.618   18.699
  0.00  56.32  21.83  42.89  93.14  89.00    151    3.081    46   15.618   18.699

S0 :Survivor0里面是空的
S1 :Survivor1使用了56.32%的空间
E :Eden区使用了21.83%的空间
O :老年代使用了42.89%的空间
M :元空间(Metaspace)使用了93.14%的空间,如果是JDK7及以下,这里应该是P永久代(PermGen)。M表示的是Klass Metaspace以及NoKlass Metaspace两者总共的使用率
CCS :Klass Metaspaces的使用率89.00%,也即Klass已使用的内存大小/Klass申请的内存大小
YGC :程序从启动到现在总共发生的Minor GC 151次
YGCT :程序从启动到现在的Minor GC耗时3.081秒
FGC :程序从启动到现在总共发生的Full GC 46次
FGCT :程序从启动到现在的Full GC耗时15.618秒
GCT :程序从启动到现在的所有GC总耗时18.699秒

jinfo:Java配置信息工具

jinfo - Configuration Info是用于实时查看和调整虚拟机各项参数,包括Java System properties和虚拟机启动时的参数列表。

  • -flag name :查下虚拟机指定name的参数值
  • -flag [+|-]name :开启或关闭指定name的参数
  • -flag name=value :设置虚拟机参数值
  • -flags :输出虚拟机所有参数
  • -sysprops :输出Java system properties键值对

常用jinfo -flag MaxHeapSize 2148输出虚拟机MaxHeapSize参数的值,其中2148表示进程id号

-XX:MaxHeapSize=2147483648

jmap:Java内存映像工具

jmap - Memory Map用于生成堆转储快照(一般称为heapdump或dump文件)。

  • -dump:[live,]format=b,file=<filename> :生成Java堆转储快照,其中live表示只dump存活的对象
  • -finalizerinfo :输出在F-Queue中等待Finalizer线程执行finalize方法的对象
  • -heap :输出堆详细信息,如参数配置、GC回收器类型等
  • -histo[:live] :统计堆中对象信息,其中live标志只统计存活对象
  • -permstat :已Classloader为统计口径显示永久的内存状态
  • -F :强制生成dump文件

常用jmap -dump:format=b,file=~/tmp/test.dump 2148生成dump文件;jmap -heap 2148显示Java堆详细信息;jmap -hist:live 2148统计堆中存活对象;其中2148表示进程id号

~  jmap -dump:format=b,file=/Users/levy/tmp/test.dump 2148
Dumping heap to /Users/levy/tmp/test.dump ...
Heap dump file created

~  jmap -heap 2148
Attaching to process ID 2148, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.45-b02

using thread-local object allocation.
Parallel GC with 4 thread(s)  #java server默认为Parallel GC收集器

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 2147483648 (2048.0MB)
   NewSize                  = 44564480 (42.5MB)
   MaxNewSize               = 715653120 (682.5MB)
   OldSize                  = 89653248 (85.5MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 34078720 (32.5MB)
   used     = 681680 (0.6501007080078125MB)
   free     = 33397040 (31.849899291992188MB)
   2.000309870793269% used
From Space:
   capacity = 5242880 (5.0MB)
   used     = 0 (0.0MB)
   free     = 5242880 (5.0MB)
   0.0% used
To Space:
   capacity = 5242880 (5.0MB)
   used     = 0 (0.0MB)
   free     = 5242880 (5.0MB)
   0.0% used
PS Old Generation
   capacity = 35127296 (33.5MB)
   used     = 571416 (0.5449447631835938MB)
   free     = 34555880 (32.955055236816406MB)
   1.6267007856226678% used

746 interned Strings occupying 48616 bytes.

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

jhat - Java Heap Analysis Tooljmap搭配使用,来分析jmap生成dump文件。jhat内置了一个微型的HTTP/HTML服务器,可以在浏览器查看分析的结果

~  jhat tmp/test.dump
Reading from tmp/test.dump...
Dump file created Sat Aug 18 15:55:00 CST 2018
Snapshot read, resolving...
Resolving 7799 objects...
Chasing references, expect 1 dots.
Eliminating duplicate references.
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

分析结果如下:


jhat.png

jstack:Java堆栈跟踪工具

jstack - Stack Trace用于生成虚拟机当前时刻的线程快照(一般称为threaddump或javacore文件)。主要用于定位线程长时间停顿的原因,如线程间死锁,死循环等

  • -F :强制输出线程堆栈
  • -l :额外输出线程锁的信息
  • -m :输出本地方法的堆栈

常用jstack -l 2148查看线程堆栈信息

部分结果:

 ~  jstack -l 2148
 "Finalizer" #3 daemon prio=8 os_prio=31 tid=0x00007f852502a000 nid=0x2d03 in Object.wait() [0x00007000010fd000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00000007400104b0> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
    - locked <0x00000007400104b0> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
    at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

   Locked ownable synchronizers:
    - None

"Reference Handler" #2 daemon prio=10 os_prio=31 tid=0x00007f8525023800 nid=0x5003 in Object.wait() [0x0000700000ffa000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x0000000740009038> (a java.lang.ref.Reference$Lock)
    at java.lang.Object.wait(Object.java:502)
    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:157)
    - locked <0x0000000740009038> (a java.lang.ref.Reference$Lock)

   Locked ownable synchronizers:
    - None

"main" #1 prio=5 os_prio=31 tid=0x00007f8525802000 nid=0x2603 waiting on condition [0x00007000009e8000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at com.test.TestClass.main(TestClass.java:10)

   Locked ownable synchronizers:
    - None

"VM Thread" os_prio=31 tid=0x00007f852681a000 nid=0x5203 runnable

"GC task thread#0 (ParallelGC)" os_prio=31 tid=0x00007f852580b800 nid=0x2107 runnable

"GC task thread#1 (ParallelGC)" os_prio=31 tid=0x00007f852580c000 nid=0x2003 runnable

"GC task thread#2 (ParallelGC)" os_prio=31 tid=0x00007f852501e000 nid=0x2a03 runnable

"GC task thread#3 (ParallelGC)" os_prio=31 tid=0x00007f852501f000 nid=0x5303 runnable


感谢阅读,如果对您有所帮助,欢迎点击♡喜欢哦!谢谢!


参考

[1] https://docs.oracle.com/javase/8/docs/technotes/tools/index.html
[2] 周志明.深入理解Java虚拟机[M].北京:机械工业出版社

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

推荐阅读更多精彩内容