前提
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 Tool
与jmap
搭配使用,来分析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.
分析结果如下:
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].北京:机械工业出版社