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循环一直运行。

原文地址:https://www.cnblogs.com/qiaoshanzi/p/5717275.html