前提
JDK版本
1.8.0_45
虛擬機HotSpot(TM) 64-Bit Server VM
jps:虛擬機進程狀況工具
jps - Java Virtual Machine Process Status Tool
用于查找運行在HotSpot虛擬機上的java進程扩氢。 該工具僅限于查找其有訪問權(quán)限的JVM信息模她,如果A
用戶啟動一個Java
程序督勺,B
用戶使用jps
命令則無法查看到該進程舍哄,但通吃萋龋可以通過ps -ef|grep java
查看
jps工具主要選項:
- -q :只輸出進程id
- -m :輸出虛擬機進程啟動時傳遞給main()函數(shù)的參數(shù)
- -l :輸出主類的全名吱型,如果是jar包赤屋,則輸出jar包路徑
- -v :輸出虛擬機進程啟動時的JVM參數(shù)
常用 :jps -lv
顯示主類的全名,并顯示JVM參數(shù)
~ 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:虛擬機統(tǒng)計信息監(jiān)視工具
jstat - Java Virtual Machine Statistics Monitoring Tool
是用于監(jiān)視HotSpot虛擬機各種運行狀態(tài)信息的工具师逸,它是運行期間定位虛擬機性能問題的首選工具司倚。
jstat工具主要選項:
- -class :監(jiān)視類裝載、卸載數(shù)量篓像、總空間以及裝載所耗費的時間
- -gc :監(jiān)視Java堆狀況
- -gccapacity :監(jiān)視Java堆狀況对湃,主要關(guān)注各個區(qū)域使用的最大、最小空間
- -gcutil :監(jiān)視Java堆狀況遗淳,主要關(guān)注已使用空間占總空間的百分比
- -gccause :與-gcutil功能一樣,但是會額外輸出導(dǎo)致上一次GC產(chǎn)生的原因
- -gcnew :監(jiān)視新生代GC狀況
- -gcnewcapacity :監(jiān)視新生代GC狀況心傀,主要關(guān)注使用到的最大屈暗、最小空間
- -gcold :監(jiān)視老年代GC狀況
- -gcoldcapacity :監(jiān)視老年代GC狀況,主要關(guān)注使用到的最大脂男、最小空間
- -gcpermcapacity :輸出永久代使用到的最大养叛、最小空間
- -compiler :輸出JIT編譯器編譯過的方法、耗時等
- -printcompilation :輸出已經(jīng)被JIT編譯器編譯的方法
常用 :jstat -gcutil 467 1000 3
顯示主類的全名宰翅,并顯示JVM參數(shù)弃甥,其中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區(qū)使用了21.83%的空間
O :老年代使用了42.89%的空間
M :元空間(Metaspace)使用了93.14%的空間嘿架,如果是JDK7及以下瓶珊,這里應(yīng)該是P永久代(PermGen)。M表示的是Klass Metaspace以及NoKlass Metaspace兩者總共的使用率
CCS :Klass Metaspaces的使用率89.00%耸彪,也即Klass已使用的內(nèi)存大小/Klass申請的內(nèi)存大小
YGC :程序從啟動到現(xiàn)在總共發(fā)生的Minor GC 151次
YGCT :程序從啟動到現(xiàn)在的Minor GC耗時3.081秒
FGC :程序從啟動到現(xiàn)在總共發(fā)生的Full GC 46次
FGCT :程序從啟動到現(xiàn)在的Full GC耗時15.618秒
GCT :程序從啟動到現(xiàn)在的所有GC總耗時18.699秒
jinfo:Java配置信息工具
jinfo - Configuration Info
是用于實時查看和調(diào)整虛擬機各項參數(shù)伞芹,包括Java System properties和虛擬機啟動時的參數(shù)列表。
- -flag name :查下虛擬機指定name的參數(shù)值
- -flag [+|-]name :開啟或關(guān)閉指定name的參數(shù)
- -flag name=value :設(shè)置虛擬機參數(shù)值
- -flags :輸出虛擬機所有參數(shù)
- -sysprops :輸出Java system properties鍵值對
常用 :jinfo -flag MaxHeapSize 2148
輸出虛擬機MaxHeapSize參數(shù)的值,其中2148
表示進程id號
-XX:MaxHeapSize=2147483648
jmap:Java內(nèi)存映像工具
jmap - Memory Map
用于生成堆轉(zhuǎn)儲快照(一般稱為heapdump或dump文件)唱较。
-
-dump:[live,]format=b,file=<filename> :生成Java堆轉(zhuǎn)儲快照扎唾,其中
live
表示只dump存活的對象 - -finalizerinfo :輸出在F-Queue中等待Finalizer線程執(zhí)行finalize方法的對象
- -heap :輸出堆詳細信息,如參數(shù)配置南缓、GC回收器類型等
- -histo[:live] :統(tǒng)計堆中對象信息胸遇,其中l(wèi)ive標志只統(tǒng)計存活對象
- -permstat :已Classloader為統(tǒng)計口徑顯示永久的內(nèi)存狀態(tài)
- -F :強制生成dump文件
常用 :jmap -dump:format=b,file=~/tmp/test.dump 2148
生成dump文件;jmap -heap 2148
顯示Java堆詳細信息西乖;jmap -hist:live 2148
統(tǒng)計堆中存活對象狐榔;其中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:虛擬機堆轉(zhuǎn)儲快照分析工具
jhat - Java Heap Analysis Tool
與jmap
搭配使用,來分析jmap
生成dump文件获雕。jhat內(nèi)置了一個微型的HTTP/HTML服務(wù)器薄腻,可以在瀏覽器查看分析的結(jié)果
~ 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.
分析結(jié)果如下:
jstack:Java堆棧跟蹤工具
jstack - Stack Trace
用于生成虛擬機當(dāng)前時刻的線程快照(一般稱為threaddump或javacore文件)。主要用于定位線程長時間停頓的原因届案,如線程間死鎖庵楷,死循環(huán)等
- -F :強制輸出線程堆棧
- -l :額外輸出線程鎖的信息
- -m :輸出本地方法的堆棧
常用 :jstack -l 2148
查看線程堆棧信息
部分結(jié)果:
~ 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].北京:機械工業(yè)出版社