服務重啟導致的Java服務抖動CPU佔用高
今天后臺組發現新上線的應用CPU總是會佔用過高。(心裡暗罵,新來的運維真無聊,閒著沒事看top幹啥)
首先發送命令 jps -lv 查詢執行的程序pid=18182,
[admin@HCX-SER04 service-8072]$ jps 19017 Jps 18827 jar
然後通過top -Hp 18182,檢視哪個執行緒佔用CPU過高。
[admin@HCX-SER04 ~]$ top -Hp 18827 top - 18:22:02 up 135 days,4:09,8 users,load average: 0.14, 0.16, 0.07 Tasks: 137 total,1 running, 136 sleeping,0 stopped,0 zombie Cpu(s): 43.6%us,5.2%sy,0.0%ni, 50.2%id,0.0%wa,0.0%hi,1.0%si,0.0%st Mem:2054152k total,1816632k used,237520k free,30808k buffers Swap:4194300k total,0k used,4194300k free,415516k cached PID USERPRNIVIRTRESSHR S %CPU %MEMTIME+COMMAND 18838 admin200 3373m 1.1g15m R 39.9 55.90:22.16 java 18871 admin200 3373m 1.1g15m S4.7 55.90:04.73 java 18881 admin200 3373m 1.1g15m S0.3 55.90:00.05 java 18905 admin200 3373m 1.1g15m S0.3 55.90:00.05 java
將執行緒ID轉為16進位制
[admin@HCX-SER04 ~]$ python -c "print hex(18838)" 0x4996
然後使用命令jstack 18827 做執行緒dump
[admin@HCX-SER04 ~]$ jstack 18827 > 18827.log [admin@HCX-SER04 ~]$
後面就簡單了,把執行緒dump檔案直接less開啟,找到佔用高的堆疊資訊(這裡是十六進位制的執行緒ID)。
(END) "C2 CompilerThread0" #8 daemon prio=9 os_prio=0 tid=0x00007fb6e410c000 nid=0x4996 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "JDWP Event Helper Thread" #7 daemon prio=10 os_prio=0 tid=0x00007fb6e4109800 nid=0x4995 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE
原來是C2 CompilerThread。呵呵,這下簡單了原來是C2編譯器導致的。凡是伺服器重啟後,java都會把class檔案進行編譯優化,沒辦法,告訴他們這是無法避免的,java程式就是這樣,上線還是晚上吧,免的服務抖動,大驚小怪。;)