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= :生成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].北京:机械工业出版社

你可能感兴趣的:(jps,jstat,jstack,jmp,jinfo,jhat使用详解及JDK监控和故障处理工具)