jps,jstat,jstack,jmp,jinfo,jhat使用詳解及JDK監(jiān)控和故障處理工具

前提

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 Tooljmap搭配使用,來分析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é)果如下:


jhat.png

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è)出版社

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末童漩,一起剝皮案震驚了整個濱河市弄贿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌矫膨,老刑警劉巖差凹,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異侧馅,居然都是意外死亡危尿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門馁痴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谊娇,“玉大人,你說我怎么就攤上這事罗晕〖没叮” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵小渊,是天一觀的道長船逮。 經(jīng)常有香客問我,道長粤铭,這世上最難降的妖魔是什么挖胃? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上酱鸭,老公的妹妹穿的比我還像新娘吗垮。我一直安慰自己,他們只是感情好凹髓,可當(dāng)我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布烁登。 她就那樣靜靜地躺著,像睡著了一般蔚舀。 火紅的嫁衣襯著肌膚如雪饵沧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天赌躺,我揣著相機與錄音狼牺,去河邊找鬼。 笑死礼患,一個胖子當(dāng)著我的面吹牛是钥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缅叠,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼悄泥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肤粱?” 一聲冷哼從身側(cè)響起弹囚,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎领曼,沒想到半個月后余寥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡悯森,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了绪撵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓢姻。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖音诈,靈堂內(nèi)的尸體忽然破棺而出幻碱,到底是詐尸還是另有隱情,我是刑警寧澤细溅,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布褥傍,位于F島的核電站,受9級特大地震影響喇聊,放射性物質(zhì)發(fā)生泄漏恍风。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望朋贬。 院中可真熱鬧凯楔,春花似錦、人聲如沸锦募。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽糠亩。三九已至虐骑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赎线,已是汗流浹背廷没。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留氛驮,地道東北人腕柜。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像矫废,于是被迫代替她去往敵國和親盏缤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容