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循环一直运行。
posted on 2016-07-29 10:12 qiaoshanzi 阅读(2257) 评论(0) 编辑 收藏 举报