在生產環境中,當服務出現性能問題時,如:線程數異常、負載升高,如何快速定位問題,本文梳理一下大致思路及步驟。
通常我們需要首先定位問題線程,找到占用資源較多的線程號,然后才能針對該線程進行分析。
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等工具進行分析。