JVM性能調優監測工具

查看正在運行的程序

jps主要用來輸出JVM中運行的進程狀態信息。語法格式如下:

 
jps [options] [hostid]

options:
-q 不輸出類名、Jar名和傳入main方法的參數
-m 輸出傳入main方法的參數
-l 輸出main類或Jar的全限名
-v 輸出傳入JVM的參數

hostid:不填,默認爲本機

CPU飆升排查

jstack主要用來查看某個Java進程內的線程堆棧信息。

  1. 通過 top 命令找到 CPU 消耗最高的進程,並記住進程 ID。
  2. 再次通過 top -Hp [進程 ID] 找到 CPU 消耗最高的線程 ID,並記住線程 ID.
  3. 通過 JDK 提供的 jstack 工具 dump 線程堆棧信息到指定文件中。具體命令:jstack -l [進程 ID] >jstack.log。
  4. 由於剛剛的線程 ID 是十進制的,而堆棧信息中的線程 ID 是16進制的,因此我們需要將10進制的轉換成16進制的,並用這個線程 ID 在堆棧中查找。使用 printf “%x\n” [十進制數字] ,可以將10進制轉換成16進制。
  5. 通過剛剛轉換的16進制數字從堆棧信息裏找到對應的線程堆棧。就可以從該堆棧中看出端倪。

C2 編譯器執行編譯時也會搶佔 CPU,什麼是 C2編譯器呢?當 Java 某一段代碼執行次數超過10000次(默認)後,就會將該段代碼從解釋執行改爲編譯執行,也就是編譯成機器碼以提高速度。而這個 C2編譯器就是做這個的。如何解決呢?項目上線後,可以先通過壓測工具進行預熱,這樣,等用戶真正訪問的時候,C2編譯器就不會干擾應用程序了。如果是 GC 線程導致的,那麼極有可能是 Full GC ,那麼就要進行 GC 的優化。

內存使用情況監測

jmap用來查看堆內存使用狀況。

  • 使用jmap -heap pid查看進程堆內存使用情況,包括使用的GC算法、堆配置參數和各代中堆內存使用情況。
  • 使用jmap -histo[:live] pid查看堆內存中的對象數目、大小統計直方圖,如果帶上live則只統計活對象。
  • 使用jmap -permstat pid 打印classload和jvm heap長久層的信息. 包含每個classloader的名字,活潑性,地址,父classloader和加載的class數量. 另外,內部String的數量和佔用內存數也會打印出來。

JVM統計監測

jstat命令可以查看堆內存各部分的使用量,以及加載類的數量

 
jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]

 

比如下面輸出的是GC信息,採樣時間間隔爲250ms,採樣數爲4:

 
   jstat -gc 14157 250 4
S0C     S1C     S0U     S1U       EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT   
192.0  192.0   64.0   0.0    6144.0   1854.9   32000.0     4111.6   55296.0 25472.7    702    0.431   3      0.218    0.649
192.0  192.0   64.0   0.0    6144.0   1972.2   32000.0     4111.6   55296.0 25472.7    702    0.431   3      0.218    0.649
192.0  192.0   64.0   0.0    6144.0   1972.2   32000.0     4111.6   55296.0 25472.7    702    0.431   3      0.218    0.649
192.0  192.0   64.0   0.0    6144.0   2109.7   32000.0     4111.6   55296.0 25472.7    702    0.431   3      0.218    0.649

 

我們知道
堆內存 = 年輕代 + 年老代 + 永久代
年輕代 = Eden區 + 兩個Survivor區(From和To)

 
S0C、S1C、S0U、S1U:Survivor 0/1區容量(Capacity)和使用量(Used)
EC、EU:Eden區容量和使用量
OC、OU:年老代容量和使用量
PC、PU:永久代容量和使用量
YGC、YGT:年輕代GC次數和GC耗時
FGC、FGCT:Full GC次數和Full GC耗時
GCT:GC總耗時

查看文件字節碼

這裏擴展一下如何查看文件字節碼

 
Javac Foo.java 將文件解析成class字節碼文件
Javap Foo.class 打印所有非私有的字段和方法
Javap -p Foo.class 還將打印私有的字段和方法
Javap -v Foo.class 儘可能打印所有信息
Javap -c Foo.class 打印方法對應的字節碼

參考鏈接:
https://mp.weixin.qq.com/s/-5vdgexMyoiMRVPlOO88Sw
https://mp.weixin.qq.com/s/LJGWPRBc_BJLTfopi7Lttg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章