top 命令
top 命令查看現在線程占用資料的情況。
第三行,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
使用 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檢測統計工具,可以對** 堆內存的使用情況進行實時統計** 。
上面數值的含義和JVM的參數一一對應
E : Eden區 O : Old區 FGC : Full GC 次數,例子中共 4 次 FGCT : Full GC 的時間,例子共0.2秒左右
這個工具對於查內存泄漏非常有用。這里引用參考資料中的一個內存泄漏例子 :
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