【JVM-04】線上CPU100%
- 1. 如何排查
- 2. 再舉一個例子
1. 如何排查
?般CPU100%瘋狂GC,都是死循環的鍋,那怎么排查呢?先進服務器,?top -c 命令找出當前進程的運?列表按?下 P 可以按照CPU使?率進?排序顯示Java進程 PID 為 2609 的java進程消耗最?。
[root@VM-8-7-centos ~]# top -c
然后我們需要根據PID 查出CPU??消耗最?的進程
使?命令 top -Hp 2609 找出這個進程下?的線程,繼續按P排序
[root@VM-8-7-centos ~]# top -Hp 2609
可以看到 2854 CPU消耗最?
2854是?進制的,我們需要轉換為?六進制,轉換結果:b26
接下來就需要導出我們的進程快照了,看看這個線程做了啥
[root@VM-8-7-centos ~]# jstack -l 2609 > ./2609.stack
再?grep查看?下線程在?件?做了啥
[root@VM-8-7-centos ~]# cat 2609.stack |grep 'b26' -C 8
這?就隨便定位?個,基本上這樣查都可以定位到你死循環的那個類。
2. 再舉一個例子
public class FullCPU {public static void main(String[] args) {while(true){}}
}java -cp . FullCPU
PID (進程標識符)
[root@VM-8-7-centos ~]# top -Hp 12844
結合起來,top -Hp 12844 命令的作用是:
-H 顯示所有線程 -p12844 只顯示 PID 為 12844 的進程信息
- 啟動 top 命令。
- 顯示 PID 為 12844 的進程及其所有線程的詳細信息。
- 實時更新該進程和線程的資源使用情況。
[root@VM-8-7-centos ~]# jstack -l 12844 > ./12844.stack12845轉16進制為0x322d
cat 12844.stack |grep '0x322d' -C 8
[root@VM-8-7-centos ~]# jstack -l 12844 > ./12844.stack
執行這個命令后,jstack 工具將生成一個包含 PID 為 12844 的 Java 進程的所有線程的當前狀態的快照,并將其保存到 ./12844.stack 文件中。文件內容通常包括每個線程的堆棧跟蹤、線程狀態以及鎖信息。
完整命令:cat 12844.stack | grep '0x322d' -C 8
- 這條命令首先使用 cat 命令顯示 12844.stack 文件的內容。
- 然后通過管道符 | 將 cat 命令的輸出傳遞給 grep 命令。
- grep 命令搜索包含 ‘0x322d’ 的行,并顯示該行及其上下 8 行的內容。