1. 程式人生 > >JVM六:查詢最最耗cpu的執行緒或執行緒時間最長並定位程式碼

JVM六:查詢最最耗cpu的執行緒或執行緒時間最長並定位程式碼

jstack可以定位到執行緒堆疊,根據堆疊資訊我們可以定位到具體程式碼,所以它在JVM效能調優中使用得非常多。下面我們來一個例項找出某個Java程序中最耗費CPU的Java執行緒並定位堆疊資訊,用到的命令有ps、top、printf、jstack、grep。

第一步先找出Java程序ID,伺服器上的Java應用名稱為mrf-center:

root@ubuntu:/# ps -ef | grep mrf-center | grep -v grep
root     21711     1  1 14:47 pts/3    00:02:10 java -jar mrf-center.jar
得到程序ID為21711,第二步找出該程序內最耗費CPU的執行緒,可以使用
1)ps -Lfp pid
2)ps -mp pid -o THREAD, tid, time
3)top -Hp pid
用第三個,輸出如下:

TIME列就是各個Java執行緒耗費的CPU時間,CPU時間最長的是執行緒ID為21742的執行緒,用

printf "%x\n" 21742

得到21742的十六進位制值為54ee,下面會用到。

OK,下一步終於輪到jstack上場了,它用來輸出程序21711的堆疊資訊,然後根據執行緒ID的十六進位制值grep,如下:

root@ubuntu:/# jstack 21711 | grep 54ee
"PollIntervalRetrySchedulerThread" prio=10 tid=0x00007f950043e000 nid=0x54ee in Object.wait()

可以看到CPU消耗在PollIntervalRetrySchedulerThread這個類的Object.wait(),我找了下我的程式碼,定位到下面的程式碼:

// Idle wait
getLog().info("Thread [" + getName() + "] is idle waiting...");
schedulerThreadState = PollTaskSchedulerThreadState.IdleWaiting;
long now = System.currentTimeMillis();
long waitTime = now + getIdleWaitTime();
long timeUntilContinue = waitTime - now;
synchronized(sigLock) {
  try {
    if(!halted.get()) {
      sigLock.wait(timeUntilContinue);
    }
  } 
  catch (InterruptedException ignore) {
  }
}

它是輪詢任務的空閒等待程式碼,上面的sigLock.wait(timeUntilContinue)就對應了前面的Object.wait()。

本人已經試驗過,就是這麼查詢執行緒

相關推薦

JVM:查詢最最cpu執行執行時間定位程式碼

jstack可以定位到執行緒堆疊,根據堆疊資訊我們可以定位到具體程式碼,所以它在JVM效能調優中使用得非常多。下面我們來一個例項找出某個Java程序中最耗費CPU的Java執行緒並定位堆疊資訊,用到的命令有ps、top、printf、jstack、grep。 第一步先找出Java程序ID,伺服器上的Java

【轉】【JVMJVM調優之jstack找出cpu執行定位程式碼

jstack可以定位到執行緒堆疊,根據堆疊資訊我們可以定位到具體程式碼,所以它在JVM效能調優中使用得非常多。下面我們來一個例項找出某個Java程序中最耗費CPU的Java執行緒並定位堆疊資訊,用到的命令有ps、top、printf、jstack、grep。 第一步先找

JVM調優之jstack找出cpu執行定位程式碼

第一步:先找出java的程序Id(PID) 假設java應用名稱是zcg_commodity ps -ef|grep zcg_commodity 得到程序Id為32464 第二步:找出該程序內最消耗CPU的執行緒 top -Hp pid 輸入top

使用jstack檢視CPU的java的執行

(1)首先第一步通過top -Hp proccessId,看對應的java程序中那些執行緒正在執行,及佔用的cpu和memory的比例,如下圖所示(PID列即為執行緒id) 查     (2) printf "%x\n" PID 獲取對應的pid的16進位制, 如下所示:

初級基礎 常見的除錯bug 該程序執行自上一個步驟以來已更改

1. 附加到程序不能附加到 工具->選項 2. 除錯時候,提示:該程序或執行緒自上一個步驟以來已更改  相關解決辦法如下: 在VS環境中 勾上了 ”工具\選項--->除錯--要求原始檔與原始

檢視資料庫中執行時間查詢話費了多少秒

SQL> select dbms_undo_adv.longest_query(sysdate-1/24,sysdate) from dual;DBMS_UNDO_ADV.LONGEST_QUER

db2 優化基礎 查詢運行時間的SQL

使用 family pool pan select d+ 運行時間 dynamics sin 之前寫過一個查詢運行查看運行時間最長的應用。查詢到的是,應用程序。比如我的程序。查到的是IIS,沒什麽用。select elapsed_time_min,appl_status,

如何分析CPU執行

最耗CPU的程序可以通過pidstat命令分析,但執行緒如何分析呢?以下通過尋找最耗CPU的java執行緒為例來說明,希望能拋磚引玉。   舉例:找到最耗CPU的java執行緒 ps命令 命令:ps -mp pid -o THREAD,tid,time 或者 ps -Lfp

linux查詢消耗cpu最高的執行(jstack),記憶體佔用執行(jmap),執行gc情況(jstat)

1.linux下    top  命令查詢查詢消耗cpu最高的程序id 2. 將程序資訊匯出到日誌檔案中   ./jstack 程序id >stack.log 3.查詢程序id下消耗cpu最高的執行緒id  top -Hp  程序id               執行

window 查詢 java 程序中佔用cpu比較高的執行

概述 公司內部的一個產品 (java 開發的) 執行在 window 虛擬機器上,執行一段時間後CPU飆升,然後想檢視是哪個執行緒佔用。 折騰了一下午,終於定位到該執行緒。 下面我們通過兩種方式定位到佔用cpu比較高的執行緒。 * 1. 使用Proces

JVM調優之jstack找出cpu的線程定位代碼

grep 輪詢 tin jstack stack ads OS 分享 bject jstack可以定位到線程堆棧,根據堆棧信息我們可以定位到具體代碼,所以它在JVM性能調優中使用得非常多。下面我們來一個實例找出某個Java進程中最耗費CPU的Java線程並定位堆棧信息,用到

cpu、核與執行

cpu與核心 物理核 物理核數量=cpu數(機子上裝的cpu的數量)*每個cpu的核心數 虛擬核 所謂的4核8執行緒,4核指的是物理核心。通過超執行緒技術,用一個物理核模擬兩個虛擬核,每個核兩個執行緒,總數為8執行緒。 在作業系統看來是8個核,但是實際上是4個物

Linux 檢視系統cpu個數 核心數 執行

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Linux程序執行繫結到CPU+修改優先順序

  轉載自 https://www.cnblogs.com/swey/p/4469722.html 為了讓程式擁有更好的效能,有時候需要將程序或執行緒繫結到特定的CPU,這樣可以減少排程的開銷和保護關鍵程序或執行緒。 程序繫結到CPU Linux提供一個介面,可以

IO密集型和cpu密集型的多執行總結

執行緒是否越多越好? 分析如下: 一個計算為主的程式(專業一點稱為CPU密集型程式)。多執行緒跑的時候,可以充分利用起所有的cpu核心,比如說4個核心的cpu,開4個執行緒的時候,可以同時跑4個執行緒的運算任務,此時是最大效率。 但是如果執行緒遠遠超出cpu核心數量 反而會使得任

Linux 定位程序中CPU佔用高的執行

一、Top+pstack+gdb的組合拳 閒言少述,先直接上操作例項,再做原理講解。 1.1 用top命令找到最佔CPU的程序 top PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 22688 root 20 0 1842

認識Cpu、核和執行及其他相關概念

1、cpu、核和執行緒的關係 cpu個數: 是指物理上,也就是硬體上的核心數 核: 邏輯上的、模擬出來的核心數 執行緒數:同一時刻裝置並行執行的程式個數,執行緒數=cpu個數 * 核數 2、單核cpu和多核cpu 單核也就是說一個物理上的cpu可以模擬出來的核心數是1個,多核

JVM第九篇】:Executor框架與執行

Executor框架簡介 在Java 5之後,併發程式設計引入了一堆新的啟動、排程和管理執行緒的API。Executor框架便是Java 5中引入的,其內部使用了執行緒池機制,它在java.util.cocurrent 包下,通過該框架來控制執行緒的啟動、執行和關閉,可以簡化併發程式設計

深入理解JVM(十一)——Java記憶體模型與執行

計算機運算的速度,與它的儲存和通訊子系統相差太大,大量的時間花費在磁碟IO,網路通訊和資料庫上。 衡量一個服務效能的高低好壞,每秒事務處理數TPS是最重要的指標。 對於計算量相同的任務,程式執行緒併發協調的越有條不紊,效率越高;反之,執行緒之間頻繁阻塞或是死鎖,將大大降低併發能力。

CPU,程序,執行間的執行關係

名詞解釋(個人理解) CPU 計算機的中央處理器,一般為多核(即:多個同樣功能的裝置)。認同一個事實:單核CPU,在某個特定的時間點(微觀時間上),只能處理一個執行緒。 程序 程式關於某個資料集合上的一次執行活動,是一個過程的定義。也就是說程式執行時(程序),系統就會分配給他