JVM執行緒和記憶體溢位問題排查思路

我爱这世间美貌女子發表於2024-05-16

一、工具

ArthasArthas 是一款能線上檢視應用 load、記憶體、gc、執行緒 等狀態資訊,並對業務問題進行診斷的工具,支援 JDK 6+ 和 Linux/Mac/Windows 系統。

jstack:jstack是JVM自帶的Java堆疊跟蹤工具,它用於列印出給定的java程序ID、core file、遠端除錯服務的Java堆疊資訊。參考連線

jmap:jmap能夠列印給定Java程序、核心檔案或遠端DEBUG伺服器的共享物件記憶體對映或堆記憶體的詳細資訊。

jstat:jstat命令可以檢視堆記憶體各部分的使用量,以及載入類的數量。

jcmd:jdk1.8開始提供了一個方便擴充套件的診斷命令jcmd,用來取代之前比較分散的jdk基礎命令,如jps、jstack、jmap、jinfo等,並且jdk新增新的診斷功能。

二、jstack檢視執行緒快照

用於定位執行緒出現長時間停頓的原因,如執行緒間死鎖、死迴圈、請求外部資源導致的長時間等待等問題。

  • top,檢視各程序使用情況
  • top -Hp pid,檢視程序pid的各執行緒執行情況
  • printf '%x\n' tid,將執行緒號轉為16進位制;其中tid為執行緒號
  • jstack pid | grep '0x4295' -C10 --color,檢視程序pid的0x4295執行緒快照,分析執行緒停頓原因和程式碼行。

三、jstat統計垃圾回收情況(檢視gc頻率)

jstat -gcutil pid

S0:倖存1區當前使用比例
S1:倖存2區當前使用比例
E:伊甸園區使用比例
O:老年代使用比例
M:後設資料區使用比例
CCS:壓縮使用比例
YGC:年輕代垃圾回收次數
FGC:老年代垃圾回收次數
FGCT:老年代垃圾回收消耗時間
GCT:垃圾回收消耗總時間

四、jmap檢視堆記憶體情況、製作dump檔案

jmap -heap 17038,17038為程序號,檢視程序號位17083的程序的堆記憶體使用情況。

jmap -dump:live,format=b,file=filename.hprof pid,生成程序號位pid的程序的堆記憶體dump檔案。

五、記憶體溢位的幾個錯誤

outOfMemoryError 年老代記憶體不足。
outOfMemoryError:PermGen Space 永久代記憶體不足。
outOfMemoryError:GC overhead limit exceed 垃圾回收時間佔用系統執行時間的98%或以上。

六、排查思路

  1. 透過top命令檢視程序情況、找到最消耗資源的java程序,這一步在不知道哪個java程式消耗資源最大的情況執行,如果已經知道是哪個java程式,則可以直接進入第二步(這一步獲得程序ID pid)

  2. 透過top -Hp pid,檢視程序pid中最消耗資源的執行緒,這一步將獲得執行緒ID tid

  3. 此時可以先使用jstack命令檢視執行緒tid的執行情況

    printf '%x\n' tid這個命令將得到一個標識執行緒tid的十六進位制值nid。

    jstack pid | grep nid -C10 --color這個命令將顯示執行緒tid(nid為十六進位制表示)的執行緒快照,可以找到執行緒是否阻塞等。

  4. 使用jmap命令檢視程序pid的堆記憶體使用情況

    jmap -heap pid這個命令將顯示程序pid堆記憶體的使用情況,如果堆記憶體佔用過高,可以使用jmap生成dump檔案進行進一步分析

    jmap -dump:live,format=b,file=filename.hprof pid這個命令將生成程序pid的堆記憶體使用情況的dump檔案。

    除此之外也可以使用jstat命令分析垃圾回收情況,看看是否進行頻繁的gc。

    jstat -gcutil pid這個命令將顯示程序pid的gc頻率等。

  5. 最後檢視程式日誌是否有outOfMemoryErroroutOfMemoryError:PermGen SpaceoutOfMemoryError:GC overhead limit exceed等記憶體溢位相關錯誤,這個也可以在第一步之前檢視。

  6. 如果確定是記憶體溢位問題,最好使用視覺化工具分析生成的dump檔案,找到記憶體溢位的位置。(一般在啟動java程式時配置jvm儲存dump檔案)

注:為了出現記憶體溢位問題時能夠排查問題,執行jar包時新增jvm配置:

java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/tmp/heapdump.hprof -jar app.jar

這將保留堆記憶體快照,以便將來分析記憶體使用。

本筆記只記錄每個工具可以用來檢視什麼資訊以及什麼時候可以用什麼工具,並不記錄上述工具的詳細使用方法。

相關文章