環境
centos7 1核2GBhtml
Java8java
模擬cpu佔用高
新建一個名爲jvm-learn的springboot項目
模擬代碼以下web
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @SpringBootApplication public class JvmLearnApplication { public static void main(String[] args) { SpringApplication.run(JvmLearnApplication.class, args); } @GetMapping("cpu") public void cpu() { while (true) { } } }
打包
在項目根目錄下執行以下命令:spring
mvn clean package -Dmaven.test.skip=true
啓動jar包
nohup java -jar jvm-learn-0.0.1-SNAPSHOT.jar &
訪問
curl localhost:8080/cpu
排查
查看佔用cpu高的進程
top
以下圖:可看出PID爲7149的java進程佔用cpu最高,達到了98%centos
查看進程中最耗cpu的子線程
top -p 7149 -H
以下圖:可看出PID爲7166的線程佔用cpu最高,達到了97.7%springboot
將最耗cpu的線程id轉換爲16進制輸出
printf "%x \n" 7166
查詢具體出現問題的代碼位置
jstack 7149 | grep 1bfe -A 30
以下圖:可看出是JVMLearnApplication類的第18行出現問題app