目錄
案例
發現問題
排查問題
步驟一
步驟二
步驟三
案例
import java.util.concurrent.TimeUnit;/*** 簡單寫一個CPU飆高的案例*/
public class CpuLoadUp {// 這里定義了一個標識private volatile static int flag = 0;public static void main(String[] args) {// 執行線程A的處理邏輯threadAProcess();// 執行線程B的處理邏輯threadBProcess();}public static void threadAProcess() {// 這里只是作為案例演示,實際上這里使用的是線程池new Thread(() -> {try {// 這里模擬業務邏輯需要處理很久TimeUnit.MINUTES.sleep(10);// 業務處理完之后更改標識flag為1flag = 1;} catch (InterruptedException e) {// 業務邏輯處理失敗}}, "thread-A").start();}public static void threadBProcess() {// 這里只是案例演示,實際上這里使用的是線程池new Thread(() -> {// thread-A中的業務邏輯執行太久使得這里一直循環for (; ; ) {// 執行某業務邏輯// 直到flag為1時,執行結束,跳出循環if (flag == 1) {break;}}}, "thread-B").start();}
}
發現問題
- 使用【top】命令查看到有一個java進程CPU飆到100%,進程號為2567
- 使用【jps】命令查看到正在運行的java程序
# top指令查看系統后臺的進程狀態
top
# jps指令查看正在運行的Java進程
jps
排查問題
步驟一
使用【top -Hp <進程ID>】查看進程中占用率最高的線程,占用率達到99.9%的線程PID為2578
top -Hp 2567
步驟二
將線程的PID轉換為十六進制,結果是a12
public class MainTest {public static void main(String[] args) {// 查看2578的十六進制數,結果為a12System.out.println(Integer.toHexString(2578));}
}
步驟三
使用【jstack】命令查看線程堆棧信息,用十六進制線程ID搜索
# [-A 10]代表查看后10行信息
jstack 2567 | grep -A 10 'a12'