java CPU占用高分析


 1 import java.io.BufferedReader;
 2 import java.io.InputStreamReader;
 3 
 4 public class CPUTest {
 5     public static void createBusyThread() {
 6         Thread thread = new Thread(new Runnable() {
 7             @Override
 8             public void run() {
 9                 while (true)   // 第41行
10                     ;
11             }
12         }, "testBusyThread");
13         thread.start();
14         }
15 
16         /**
17          * 線程鎖等待演示
18          */
19         public static void createLockThread(final Object lock) {
20         Thread thread = new Thread(new Runnable() {
21             @Override
22             public void run() {
23                 synchronized (lock) {
24                     try {
25                         lock.wait();
26                     } catch (InterruptedException e) {
27                         e.printStackTrace();
28                     }
29                 }
30             }
31         }, "testLockThread");
32         thread.start();
33         }
34 
35         public static void main(String[] args) throws Exception {
36             BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
37             br.readLine();
38             createBusyThread();
39             br.readLine();
40             Object obj = new Object();
41             createLockThread(obj);
42         }
43 }

這是源代碼。

用命令top結果如下:

從上圖可以看出進程6777CPU占用率特別高,下面用命令top -p 6777 -H 查看具體是這個進程的哪個線程占用CPU高。

上圖可知是線程7003.線程好轉換成16進制,注意是小寫字母,0x1b5b。使用jstack 6777|grep -A 10 0x1b5b來查詢出具體的線程狀態

找到上邊代碼的第十行,發現是while循環一直運行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM