1 CPU使用率過高問題定位
1.1 配合使用top+jstack定位(重要)
首先使用top
找到CPU使用率最高的進程。
接着查看36032進程的線程情況。
top -Hp 36032
找到36044線程CPU佔用率最高,然後將線程號轉爲16進制。
# printf %x 36044
8ccc
最後,使用jstack dump 36032進程的日誌到1.txt文件。匹配8ccc之後打印後面30行,從而定位到問題代碼行數。
# jstack 36032 > 1.txt
# cat 1.txt | grep -A 30 8ccc
備註:top定位的線程號是十進制的,而jstack dump出來的是十六進制的。
1.2 使用JMC查看線程情況
利用JFR動態監控出線程情況。
1.3 CPU使用過高的場景
- 使用無限循環==>儘量避免
- 頻繁GC,GC線程爭用CPU資源==>降低GC頻率
- 頻繁創建新對象==>合理使用單例以及線程池
- 序列化和反序列化(例如解析操作)==>選用合理的API實現;選用好用的類庫
- 不合理地使用正則表達式(正則表達式引擎在進行字符匹配時會發生回溯)==>儘量使正則匹配不回溯。
- 頻繁的線程上下文切換。==>業務改造,減低頻率。