JVM性能問題排查方法(使用jstack, jmap)


在生產環境中,當服務出現性能問題時,如:線程數異常、負載升高,如何快速定位問題,本文梳理一下大致思路及步驟。

通常我們需要首先定位問題線程,找到占用資源較多的線程號,然后才能針對該線程進行分析。

1.查看當前Java進程號

登錄服務器,執行命令:

$ps aux | grep {service-name}

查看到目標進程號,如圖所示目標服務的進程號為19083

2.使用Java進程號查看線程資源占用情況

執行命令:

$top -Hp {pid}

TIME列是各個線程耗費的CPU時間,占用時間最長的線程號是19228

3.查看線程的棧信息

將線程id轉換為16進制,以便后續查看該線程的棧信息:如下轉換得到4b1c

$printf %x 19228

執行以下命令查看當前線程對應的棧信息

#注意:一般線上環境啟動Java程序用戶與當前登錄用戶可能不一致,需要sudo權限
$sudo -u username /home/username/jdk/bin/jstack {pid} | grep {thread_id}

4.查看堆內存狀態

首先可查看堆內存對象數據、大小信息。執行命令:

$sudo -u username /home/username/jdk/bin/jmap -histo:live {pid} | more

可查看當前堆內存中存活對象的統計信息,若某些對象數量過大、占用內存過高,則可能存在問題。

5.導出堆內存進行分析

還可將堆內存快照生成轉儲文件,進行分析。執行命令:

$sudo -u username /home/username/jdk/bin/jmap -dump:format=b,file=dump_file_name.hprof {pid}

生成轉儲文件后,可使用jvisualvm等工具進行分析。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM