日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何定位消耗CPU最多的线程

發(fā)布時間:2025/3/21 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何定位消耗CPU最多的线程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

之前有朋友反饋說發(fā)的內容希望有個梯度,逐步加深,前面發(fā)了幾篇關于jvm源碼分析的文章,可能我覺得我已經(jīng)把內容寫得淺顯易懂了,但是對于某些沒怎么接觸的同學來說還是比較難理解,這個我以后慢慢改進吧,今天發(fā)篇輕松點的文章,可能大家在工作過程中也會可能碰到類似的問題,或許有經(jīng)驗的同學看到這個題目就知道我要說什么了,也有自己的定位方法。

話不多說了,先來看代碼吧

public class Test{public static void main(String args[]){for(int i=0;i<10;i++){new Thread(){public void run(){try{Thread.sleep(100000);}catch(Exception e){}}}.start();}Thread t=new Thread(){public void run(){int i=0;while(true){i=(i++)/100;}}};t.setName("Busiest Thread");t.start();} }

這個例子里新創(chuàng)建了11個線程,其中10個線程沒干什么事,主要是sleep,另外有一個線程在循環(huán)里一直跑著,可以想象這個線程是這個進程里最耗cpu的線程了,那怎么把這個線程給抓出來呢?

首先我們可以通過top -Hp <pid>來看這個進程里所有線程的cpu消耗情況,得到類似下面的數(shù)據(jù)

$ top -Hp 18207 top - 19:11:43 up 573 days, ?2:43, ?2 users, ?load average: 3.03, 3.03, 3.02 Tasks: ?44 total, ? 1 running, ?43 sleeping, ? 0 stopped, ? 0 zombie Cpu(s): 18.8%us, ?0.0%sy, ?0.0%ni, 81.1%id, ?0.0%wa, ?0.0%hi, ?0.0%si, ?0.0%st Mem: ?99191752k total, 98683576k used, ? 508176k free, ? 128248k buffers Swap: ?1999864k total, ? 191064k used, ?1808800k free, 17413760k cachedPID USER ? ? ?PR ?NI ?VIRT ?RES ?SHR S %CPU %MEM ? ?TIME+ ?COMMAND 18250 admin ? ? 20 ? 0 26.1g ?28m ?10m R 99.9 ?0.0 ? 0:19.50 java Test 18207 admin ? ? 20 ? 0 26.1g ?28m ?10m S ?0.0 ?0.0 ? 0:00.00 java Test 18208 admin ? ? 20 ? 0 26.1g ?28m ?10m S ?0.0 ?0.0 ? 0:00.09 java Test 18209 admin ? ? 20 ? 0 26.1g ?28m ?10m S ?0.0 ?0.0 ? 0:00.00 java Test 18210 admin ? ? 20 ? 0 26.1g ?28m ?10m S ?0.0 ?0.0 ? 0:00.00 java Test 18211 admin ? ? 20 ? 0 26.1g ?28m ?10m S ?0.0 ?0.0 ? 0:00.00 java Test 18212 admin ? ? 20 ? 0 26.1g ?28m ?10m S ?0.0 ?0.0 ? 0:00.00 java Test 18213 admin ? ? 20 ? 0 26.1g ?28m ?10m S ?0.0 ?0.0 ? 0:00.00 java Test 18214 admin ? ? 20 ? 0 26.1g ?28m ?10m S ?0.0 ?0.0 ? 0:00.00 java Test 18215 admin ? ? 20 ? 0 26.1g ?28m ?10m S ?0.0 ?0.0 ? 0:00.00 java Test 18216 admin ? ? 20 ? 0 26.1g ?28m ?10m S ?0.0 ?0.0 ? 0:00.00 java Test 18217 admin ? ? 20 ? 0 26.1g ?28m ?10m S ?0.0 ?0.0 ? 0:00.00 java Test 18218 admin ? ? 20 ? 0 26.1g ?28m ?10m S ?0.0 ?0.0 ? 0:00.00 java Test 18219 admin ? ? 20 ? 0 26.1g ?28m ?10m S ?0.0 ?0.0 ? 0:00.00 java Test 18220 admin ? ? 20 ? 0 26.1g ?28m ?10m S ?0.0 ?0.0 ? 0:00.00 java Test 18221 admin ? ? 20 ? 0 26.1g ?28m ?10m S ?0.0 ?0.0 ? 0:00.00 java Test 18222 admin ? ? 20 ? 0 26.1g ?28m ?10m S ?0.0 ?0.0 ? 0:00.00 java Test 18223 admin ? ? 20 ? 0 26.1g ?28m ?10m S ?0.0 ?0.0 ? 0:00.00 java Test 18224 admin ? ? 20 ? 0 26.1g ?28m ?10m S ?0.0 ?0.0 ? 0:00.00 java Test 18225 admin ? ? 20 ? 0 26.1g ?28m ?10m S ?0.0 ?0.0 ? 0:00.00 java Test 18226 admin ? ? 20 ? 0 26.1g ?28m ?10m S ?0.0 ?0.0 ? 0:00.00 java Test 18227 admin ? ? 20 ? 0 26.1g ?28m ?10m S ?0.0 ?0.0 ? 0:00.00 java Test

拿到這個結果之后,我們可以看到cpu最高的線程是pid為18250的線程,占了99.9%:

PID USER ? ? ?PR ?NI ?VIRT ?RES ?SHR S %CPU %MEM ? ?TIME+ ?COMMAND 18250 admin ? ? 20 ? 0 26.1g ?28m ?10m R 99.9 ?0.0 ? 0:19.50 java Test

接著我們可以通過jstack <pid>的輸出來看各個線程棧:

$ jstack 18207 2016-03-30 19:12:23 Full thread dump OpenJDK 64-Bit Server VM (25.66-b60 mixed mode):"Attach Listener" #30 daemon prio=9 os_prio=0 tid=0x00007fb90be13000 nid=0x47d7 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE"DestroyJavaVM" #29 prio=5 os_prio=0 tid=0x00007fb96245b800 nid=0x4720 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE"Busiest Thread" #28 prio=5 os_prio=0 tid=0x00007fb91498d000 nid=0x474a runnable [0x00007fb9065fe000]java.lang.Thread.State: RUNNABLEat Test$2.run(Test.java:18)"Thread-9" #27 prio=5 os_prio=0 tid=0x00007fb91498c800 nid=0x4749 waiting on condition [0x00007fb906bfe000]java.lang.Thread.State: TIMED_WAITING (sleeping)at java.lang.Thread.sleep(Native Method)at Test$1.run(Test.java:9)"Thread-8" #26 prio=5 os_prio=0 tid=0x00007fb91498b800 nid=0x4748 waiting on condition [0x00007fb906ffe000]java.lang.Thread.State: TIMED_WAITING (sleeping)at java.lang.Thread.sleep(Native Method)at Test$1.run(Test.java:9)"Thread-7" #25 prio=5 os_prio=0 tid=0x00007fb91498b000 nid=0x4747 waiting on condition [0x00007fb9073fe000]java.lang.Thread.State: TIMED_WAITING (sleeping)at java.lang.Thread.sleep(Native Method)at Test$1.run(Test.java:9)"Thread-6" #24 prio=5 os_prio=0 tid=0x00007fb91498a000 nid=0x4746 waiting on condition [0x00007fb9077fe000]java.lang.Thread.State: TIMED_WAITING (sleeping)at java.lang.Thread.sleep(Native Method)at Test$1.run(Test.java:9) ...

上面的線程棧我們注意到nid的值其實就是線程ID,它是十六進制的,我們將消耗cpu最高的線程18250,轉成十六進制0X474A,然后從上面的線程棧里找到nid=0X474A的線程,其棧為:

"Busiest Thread" #28 prio=5 os_prio=0 tid=0x00007fb91498d000 nid=0x474a runnable [0x00007fb9065fe000]java.lang.Thread.State: RUNNABLEat Test$2.run(Test.java:18)

即將最耗cpu的線程找出來了,是Busiest Thread

總結

以上是生活随笔為你收集整理的如何定位消耗CPU最多的线程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。