確定哪個線程佔用了大量 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
MemoryAnalyzer.ini 中的Xmx,保證可以裝在堆文件。
堆文件導入MAT,進行分析
File-> Open File
導入文件,耐心等待幾分鐘,之後選擇Leak Suspects Report (泄漏探測)
在探測報告中,查看堆棧信息,點擊 See stacktrace
定位到相應代碼,具體分析
注意事項
dump操作,耗時,生產環境慎用。
替代方案
寫在最後
這次排查,是poi讀取大excel,造成的內存一次,csv還是首選,excel慎用