環境
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
