查看正在運行的程序
jps主要用來輸出JVM中運行的進程狀態信息。語法格式如下:
|
CPU飆升排查
jstack主要用來查看某個Java進程內的線程堆棧信息。
- 通過 top 命令找到 CPU 消耗最高的進程,並記住進程 ID。
- 再次通過 top -Hp [進程 ID] 找到 CPU 消耗最高的線程 ID,並記住線程 ID.
- 通過 JDK 提供的 jstack 工具 dump 線程堆棧信息到指定文件中。具體命令:jstack -l [進程 ID] >jstack.log。
- 由於剛剛的線程 ID 是十進制的,而堆棧信息中的線程 ID 是16進制的,因此我們需要將10進制的轉換成16進制的,並用這個線程 ID 在堆棧中查找。使用 printf “%x\n” [十進制數字] ,可以將10進制轉換成16進制。
- 通過剛剛轉換的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命令可以查看堆內存各部分的使用量,以及加載類的數量
|
比如下面輸出的是GC信息,採樣時間間隔爲250ms,採樣數爲4:
|
我們知道
堆內存 = 年輕代 + 年老代 + 永久代
年輕代 = Eden區 + 兩個Survivor區(From和To)
|
查看文件字節碼
這裏擴展一下如何查看文件字節碼
|
參考鏈接:
https://mp.weixin.qq.com/s/-5vdgexMyoiMRVPlOO88Sw
https://mp.weixin.qq.com/s/LJGWPRBc_BJLTfopi7Lttg