環境
centos7 1核2GB
Java8
模擬cpu占用高
新建一個名為jvm-learn的springboot項目
模擬代碼如下
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) { } } }
打包
在項目根目錄下執行如下命令:
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%
查看進程中最耗cpu的子線程
top -Hp 7149
如下圖:可看出PID為7166的線程占用cpu最高,達到了97.7%
將最耗cpu的線程id轉換為16進制輸出
printf "%x \n" 7166
查詢具體出現問題的代碼位置
jstack 7149 | grep 1bfe -A 30
如下圖:可看出是JVMLearnApplication類的第18行出現問題
轉:https://www.cnblogs.com/zuidongfeng/p/10019262.html