記一次線上排查問題

確定哪個線程佔用了大量 CPU

查看cpu高的進程

top

查看最高的線程ThreadId

這裏假設爲996382

top -Hp \[PID\]

導出堆棧信息

jstack \[PID\] > PID.txt

獲取ThreadId對應的16進制數

printf %x \[ThreadId\]

從棧信息中查詢對應的線程內容

cat PID.txt|grep -i \[16進制的ThreadId\]

根據線程內容進行,具體分析,如果是業務線程,查看具體代碼分析,如果是GC Thread,需要繼續查看堆信息

這次是GC Thread,下面查看內存信息

分析Java內存泄漏

dump 堆文件

jmap -dump:format=b,file=[XXX.hprof] [pid]

壓縮文件,下載到本地

#壓縮 tar -xvf XXX.tar.gz [XXX.hprof] 
# 下載 sz XXX.tar.gz

本地解壓2次

Eclipse MAT 調整 內存使用

注意最新版本MAT,支持jdk11,需要下載,老的版本,這裏使用1.8.0

Eclipse MAT 下載地址

MemoryAnalyzer.ini 中的Xmx,保證可以裝在堆文件。

堆文件導入MAT,進行分析

File-> Open File 導入文件,耐心等待幾分鐘,之後選擇Leak Suspects Report (泄漏探測)

在探測報告中,查看堆棧信息,點擊 See stacktrace

定位到相應代碼,具體分析

注意事項

dump操作,耗時,生產環境慎用。

替代方案

Arthas 用戶文檔

寫在最後

這次排查,是poi讀取大excel,造成的內存一次,csv還是首選,excel慎用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章