JVM 線上故障排查基本操做--CPU飆高

JVM 線上故障排查基本操做

CPU 飈高

線上 CPU 飈高問題你們應該都遇到過,那麼如何定位問題呢?服務器

思路:首先找到 CPU 飈高的那個 Java 進程,由於你的服務器會有多個 JVM 進程。而後找到那個進程中的 「問題線程」,最後根據線程堆棧信息找到問題代碼。最後對代碼進行排查。app

如何操做呢?工具

  1. 經過 top 命令找到 CPU 消耗最高的進程,並記住進程 ID。優化

  2. 再次經過 top -Hp [進程 ID] 找到 CPU 消耗最高的線程 ID,並記住線程 ID.ui

  3. 經過 JDK 提供的 jstack 工具 dump 線程堆棧信息到指定文件中。具體命令:jstack -l [進程 ID] >jstack.log。spa

  4. 因爲剛剛的線程 ID 是十進制的,而堆棧信息中的線程 ID 是16進制的,所以咱們須要將10進制的轉換成16進制的,並用這個線程 ID 在堆棧中查找。使用 printf "%x\n" [十進制數字] ,能夠將10進制轉換成16進制。線程

  5. 經過剛剛轉換的16進制數字從堆棧信息裏找到對應的線程堆棧。就能夠從該堆棧中看出端倪。3d

從樓主的經驗來看,通常是某個業務死循環沒有出口,這種狀況能夠根據業務進行修復。還有 C2 編譯器執行編譯時也會搶佔 CPU,什麼是 C2編譯器呢?當 Java 某一段代碼執行次數超過10000次(默認)後,就會將該段代碼從解釋執行改成編譯執行,也就是編譯成機器碼以提升速度。而這個 C2編譯器就是作這個的。如何解決呢?項目上線後,能夠先經過壓測工具進行預熱,這樣,等用戶真正訪問的時候,C2編譯器就不會干擾應用程序了。若是是 GC 線程致使的,那麼極有多是 Full GC ,那麼就要進行 GC 的優化。進程

相關文章
相關標籤/搜索