jstack和jmap1

好友33發表於2024-06-26

● Jps:是java提供的一個顯示當前所有java程序pid的命令

● Jstat 命令:檢視堆記憶體各部分的使用量,載入類的數量以及GC的情況。jstat -gc 程序id 可以檢視GC日誌

● Jstack命令:主要是用來檢視java執行緒的堆疊資訊,分析執行緒有沒有死鎖,比如下面的這個兩個執行緒互相等待對方釋放鎖而產生的死鎖資訊

● Jmap:主要是用來dump java程序記憶體快照的,便於我們去分析記憶體中物件的儲存情況

記憶體檔案分析工具:

● MemoryAnalyzer:這是一款Eclipse提供的記憶體分析工具,可以結合Eclipse使用,也可獨立使用

● JProfiler,:這是由ej-technologies GmbH公司開發的一款記憶體分析工具,可以結合IDEA使用

● Jconsole:是一個用java寫的GUI程式,用來監控VM,並可監控遠端的VM

留存記憶體檔案有兩種方式:

1.是配置jvm啟動引數: -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=xxxx(檔案匯出路徑),JVM發生OOM時,自動生成dump檔案;

2.是採用jmap命令,手動進行記憶體dump。

JVM記憶體溢位問題排查-騰訊雲開發者社群-騰訊雲 (tencent.com)

一.分析cpu過高場景

1. top找出cpu佔用高的程序pid

2. top -Hp pid 檢視cpu佔用率高的執行緒

3. printf "%x\n" 153586 將執行緒id轉換16進位制列印

4. jstack -l 程序id

a.列印出堆疊資訊,分析執行緒有沒有死鎖

b.如果是GC執行緒,則有可能發生了記憶體洩漏或溢位

5.jmap -dump:file=dump.hprof 程序id 匯出dump檔案,使用記憶體檔案分析工具

6.匯入dump檔案,匯入後有各種詳細的展示檢視。比如大物件,數量多的物件,洩露猜測等。

7.排查程式碼

cpu過高原因:

1.死迴圈或長時間執行的方法

2. 過度使用執行緒,大量執行緒頻繁切換

3.記憶體洩漏,頻繁GC

相關文章