JVM工具使用和Linux-top命令解析


top 命令

top 命令查看現在線程占用資料的情況。

1297993-20191229164958154-320467418.png

第三行,cpu狀態信息,具體屬性說明如下: us — 用戶空間占用CPU的百分比。(重要) sy — 內核空間占用CPU的百分比。 ni — 改變過優先級的進程占用CPU的百分比 id — 空閑CPU百分比 wa — IO等待占用CPU的百分比 hi — 硬中斷(Hardware IRQ)占用CPU的百分比 si — 軟中斷(Software Interrupts)占用CPU的百分比

下面的表示各個線程占用資源的情況,

PID         進程id
USER        進程所有者
PR          進程優先級
NI          nice值。負值表示高優先級,正值表示低優先級
VIRT        進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES
RES         進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA
SHR         共享內存大小,單位kb
S           進程狀態。D=不可中斷的睡眠狀態 R=運行 S=睡眠 T=跟蹤/停止 Z=僵屍進程
%CPU        上次更新到現在的CPU時間占用百分比
%MEM        進程使用的物理內存百分比 (重要)
TIME+       進程使用的CPU時間總計,單位1/100秒
COMMAND     進程名稱(命令名/命令行)

比如我要查看 java 相關的所有線程占用情況

top -H -p 24334 

1297993-20191229175416147-1571300269.png

使用 jstack 命令打印堆棧工具

jstack是JDK內置的堆棧跟蹤工具

 jstack 24334 > jstack.txt 

(6902是Java進程的PID)打印出了Java進程的堆棧信息放到jstack.txt文件了;由於堆棧打印的線程的native id是十六機制的,所以,我把十進制的線程 24340轉化成十六進制 5f14

最后,通過

 cat jstack.txt  | grep -C 20 5f14 

jstat 懟內存使用情況

jstat是JDK內置的JVM檢測統計工具,可以對** 堆內存的使用情況進行實時統計** 。

1297993-20191229181452973-622647364.png

上面數值的含義和JVM的參數一一對應

E : Eden區
O : Old區
FGC  : Full GC 次數,例子中共 4 次
FGCT : Full GC 的時間,例子共0.2秒左右 

這個工具對於查內存泄漏非常有用。這里引用參考資料中的一個內存泄漏例子 :

1297993-20191229182924379-285411205.png

E(Eden區)跟O(Old區)的內存已經被耗盡了,FGC(Full GC)的次數高達6989次,FGCT(Full GC Time)的時間高達36453秒,即平均每次FGC的時間為:36453/6989 ≈ 5.21秒。也就是說,Java進程都把時間花在GC上了,所以就沒有時間來處理其他事情。

jmap 獲取進程的內存映射信息

假如真的出現了內存泄漏,那么一定要知道對應的代碼在哪里才可以解決問題,就要使用 jmap 工具查出某個線程中內存個映射的對象是哪些。

jmap -histo 24334|less

其中 |less 表示打印的頁數慢慢顯示而不是一下子刷到最底下。

實例的數量和字節數量,這樣就可以進行分析了。

jmap -histo 24334|less|grep sun

其中|grep sun則是進行一個篩選,這個命令加在其他命令后面也一樣,可以使用。

參考資料

https://blog.csdn.net/liubin1991liubin/article/details/79702640 https://segmentfault.com/q/1010000003586656


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM