cpu使用率問題
1. 在服務器上執行top命令確定是否是java進程導致的cpu過高
2. 定位到了進程之后 定位哪個線程導致的cpu過高 執行top -Hp pid 查看進程中線程的cpu占用率
3. 定位代碼 jstack 進程id |grep -A 200 線程pid(pid是16進制數)
如果是正常的用戶線程:
通過堆棧信息查看問題發生的類和代碼地址
如果是vm線程:
使用jstat -gcutil <pid> <period> <times> 命令對比多次gc情況 如果頻繁fullgc 則使用jmap dump:format=b,file=<filepath> <pid>命令 導出線程的內存占比情況
使用工具分析引用鏈信息,定位到類和代碼位置
如果內存占比不高,cpu占比也不高
1. 程序慢並且不是必現情況,壓測查看jstack堆棧信息排查阻塞點 是time wait condition等網絡問題還是 blocked問題
2. 如果某個程序處於停滯狀態,可以多次導出jstack堆棧信息 ,grep 定位出是哪個線程一直處於blocked狀態,一般線程不會阻塞20s以上,分析堆棧情況查明問題
3. 死鎖w
內存占比問題
1. 通過日志查看是元空間導致的permgen space還是堆棧異常Java heap space
2. 如果是元空間溢出一般是服務啟動時加載了過多的jar包
3. top命令查看內存占比高的進程pid
4. jmap -histo:live [pid] 查看內存占用情況