Windows上的Java線程CPU分析

本文將為您提供一個教程,介紹如何在Windows OS上快速查明Java線程貢獻者與CPU嚴重問題有關。 Windows與Linux,Solaris和AIX等其他操作系統一樣,使您可以在進程級別監視CPU利用率,還可以監視在進程中執行任務的單個線程。

在本教程中,我們創建了一個簡單的Java程序,使您可以逐步學習該技術。

故障排除工具

本教程將在下面使用以下工具:

  • Windows Process Explorer (查明高CPU線程貢獻者)
  • JVM線程轉儲(用于代碼級別的線程關聯和根本原因分析)

高CPU模擬器Java程序

下面的簡單程序只是循環并創建新的String對象。 這將使我們能夠按線程分析執行此CPU。 我建議您將其導入您選擇的IDE中,例如Eclipse并從那里運行它。 執行Windows計算機后,應立即觀察到CPU數量的增加。

package org.ph.javaee.tool.cpu;/*** HighCPUSimulator* @author Pierre-Hugues Charbonneau* http://javaeesupportpatterns.blogspot.com**/
public class HighCPUSimulator {private final static int NB_ITERATIONS = 500000000;// ~1 KB data footprintprivate final static String DATA_PREFIX = "datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata
datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatad
atadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata
datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata
datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata
datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata
datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata
datadatadatadatadatadatadata";/*** @param args*/public static void main(String[] args) {System.out.println("HIGH CPU Simulator 1.0");System.out.println("Author: Pierre-Hugues Charbonneau");System.out.println("http://javaeesupportpatterns.blogspot.com/");try {for (int i = 0; i < NB_ITERATIONS; i++) {// Perform some String manipulations to slowdown and expose looping process...String data = DATA_PREFIX + i;                }} catch (Throwable any) {System.out.println("Unexpected Exception! " + any.getMessage()+ " [" + any + "]");}System.out.println("HighCPUSimulator done!");}}

步驟#1 –啟動流程瀏覽器

Process Explorer工具以可視方式動態顯示CPU使用情況。 這對于實時分析非常有用。 如果您需要每個線程在CPU上的歷史數據,則還可以將Windows perfmon與%Processor Time&Thread Id數據計數器一起使用。 您可以從下面的鏈接下載Process Explorer:
http://technet.microsoft.com/zh-cn/sysinternals/bb896653

在我們的示例中,您可以看到在執行示例程序之后,Eclipse javaw.exe進程現在使用了約25%的CPU利用率。

步驟#2 –啟動Process Explorer的Threads視圖

下一步是顯示javaw.exe進程的“線程”視圖。 只需右鍵單擊javaw.exe進程,然后選擇“屬性”。 將根據以下快照打開“線程”視圖:

  • 第一列是線程ID(十進制格式)
  • 第二列是每個線程使用的CPU利用率%–
  • 第三列也是另一個計數器,指示線程是否正在CPU上運行

在我們的示例中,我們可以看到罪魁禍首是使用約25%CPU的線程ID#5996。

步驟#3 –生成JVM線程轉儲

此時,Process Explorer將不再有用。 目的是查明一個或多個Java線程,這些線程消耗了我們實現的大部分Java進程CPU利用率。 為了進入分析的下一個層次,您將需要捕獲JVM線程轉儲。 這將使您能夠將線程ID與線程堆棧跟蹤相關聯,從而可以查明這種處理類型正在消耗如此多的CPU。
JVM線程轉儲的生成可以通過幾種方式完成。 如果您使用的是JRockit VM,則可以按照以下示例使用jrcmd工具:

獲得線程轉儲數據后,只需搜索線程ID并找到您感興趣的線程堆棧跟蹤。
在我們的示例中,從Eclipse觸發的線程“主線程”被暴露為主要罪魁禍首,而這正是我們想要演示的。

Main Thread id=1 idx=0x4 tid=5996 prio=5 alive, native_blockedat org/ph/javaee/tool/cpu/HighCPUSimulator.main(HighCPUSimulator.java:31)at jrockit/vm/RNI.c2java(IIIII)V(Native Method)-- end of trace

步驟#4 –分析罪魁禍首的線程堆棧跟蹤并確定根本原因

此時,您應該具備進行根本原因分析所需的一切。 您將需要檢查每個線程堆棧跟蹤,并確定要處理的問題類型。 最后一步通常是您將花費大部分時間的地方,問題可能很簡單(例如無限循環),也可能很復雜(例如與垃圾回收相關的問題)。

在我們的示例中,線程轉儲確實揭示了CPU的高CPU數量來自第31行附近的示例Java程序。正如所料,它確實揭示了我們為本教程專門設計的循環條件。

for (int i = 0; i < NB_ITERATIONS; i++) {// Perform some String manipulations to slowdown and expose looping process...String data = DATA_PREFIX + i;                }

我希望本教程可以幫助您了解如何分析和幫助查明Windows OS上Java CPU問題的根本原因。 請繼續關注更多更新,下一篇文章將為您提供Java CPU故障排除指南,包括如何處理最后的分析步驟以及常見問題模式。

參考: Java EE支持模式和Java教程博客中的JCG合作伙伴 Pierre-Hugues Charbonneau在Windows上的Java線程CPU分析 。


翻譯自: https://www.javacodegeeks.com/2012/04/java-thread-cpu-analysis-on-windows.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372981.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372981.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372981.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

flask 繼承模版的基本使用1

轉載于:https://www.cnblogs.com/wanghaonull/p/6399492.html

東芝2303am維護清零_東芝打印機2303A怎樣清零

展開全部東芝e68a843231313335323631343130323136353331333365653137打印機是按照相關要求生產的正規產品&#xff0c;其清零方式與正規產品相同。因此此處將介紹常用的打印機清零方法。打印機清零一般分兩種&#xff1a;一種是手工清零&#xff0c;另一種是軟件清零。一、手工…

計算機日期函數公式大全,Excel技巧: 根據日期匯總月份的計算公式

在許多情況下&#xff0c;Excel記錄的數據將按照發生的日期進行記錄&#xff0c;但是根據日期記錄的數據將非常分散&#xff0c;通常需要每月匯總相應的數據. 在這種情況下&#xff0c;您需要將日期轉換為月份. 本文介紹了如何使用SUMPRODUCT函數按月匯總數據.公式提示在SUMPRO…

Java陷阱:內部類中的字段訪問

這本身不是一個“陷阱”&#xff0c;而是一個值得了解的實現細節。 假設我有一個帶有字段的內部類。 這樣的字段對于封閉的類是可見的&#xff0c;但是以下哪種方法是訪問它的最快方法&#xff1f; 注意&#xff01; 我只在這里查看生成的字節碼&#xff0c;而不考慮任何JIT優化…

coverity代碼檢測工具介紹_微服務測試之靜態代碼掃描

靜態代碼掃描為整個發展組織增加價值。無論您在開發組織中發揮的作用如何&#xff0c;靜態代碼掃描解決方案都具有附加價值&#xff0c;擁有軟件開發中所需要的尖端功能&#xff0c;最大限度地提高質量并管理軟件產品中的風險。背景微服務架構模式具有服務間獨立&#xff0c;可…

XML引入以及與html的區別

1.1 引入HTML: 負責網頁的結構 CSS&#xff1a; 負責網頁的樣式&#xff08;美觀&#xff09;Javascript&#xff1a; 負責在瀏覽器端與用戶進行交互。負責靜態的網頁制作的語言HTML語言特點&#xff1a;1&#xff09;由標簽組成。 <title> <p> <hr/> <br…

ADF:在任務流終結器中支持bean作用域

介紹 當我們需要在任務流消失之前完成一些最終工作&#xff08;干凈的資源&#xff0c;緊密的連接等&#xff09;時&#xff0c;這是使用任務流終結器的非常普遍的推薦做法。 和往常一樣&#xff0c;我們使用在任務流中聲明的托管bean。 托管Bean可以具有不同的范圍-請求&#…

Python 異常處理--raise函數用法

在Python中&#xff0c;要想引發異常&#xff0c;最簡單的形式就是輸入關鍵字raise&#xff0c;后跟要引發的異常的名稱。異常名稱標識出具體的類&#xff1a; Python異常處理是那些類的對象。執行raise語句時&#xff0c;Python會創建指定的異常類的一個對象。raise語句還可指…

大學計算機教學ppt數制,大學計算機基礎 第3講 數制及其相互轉換 國家精品課程課件(可編輯)...

大學計算機基礎第3講數制及其相互轉換國家精品課程課件PPT第1 章計算機基礎知識第3 講數制及其相互轉換主要教學內容數制的基本概念1 數制轉換2 小結3 學習目標1 理解數制的基本概念。2 掌握數制間的轉換。3 能夠靈活應用轉換關系完成數制之間的轉換。重點與難點不同數制之間的…

linux中匿名用戶怎么登陸_南京課工場IT培訓:Linux中vsftpd服務配置(匿名,用戶,虛擬用戶)...

vsftpd概述vsftpd 是“very secure FTP daemon”的縮寫&#xff0c;安全性是它的一個最大的特點。vsftpd 是一個 UNIX 類操作系統上運行的服務器的名字&#xff0c;它可以運行在諸如 Linux、BSD、Solaris、 HP-UNIX等系統上面&#xff0c;是一個完全免費的、開放源代碼的ftp服務…

Java _ JDK _ Arrays, LinkedList, ArrayList, Vector 及Stack

(最近在看JDK源碼&#xff0c;只是拿著它的繼承圖在看&#xff0c;但很多東西不記錄仍然印象不深&#xff0c;所以開始記錄JDK閱讀系列。) &#xff08;一&#xff09;Arrays Arrays比較特殊&#xff0c;直接繼承自Arrays -》List(Interface) -》Collection(Interface)。(Maybe…

server2016做文件服務器,『配置』服務器搭建 Office Online Server2016 實現文檔預覽 番外 錯誤篇...

安裝一個或多個角色、角色服務或功能失敗。找不到源文件。請再次嘗試在新的“添加角色和功能”向導會話中安裝角色、角色服務或功能&#xff0c;然后在向導的“確認”頁中單擊“指定備用源路徑”以指定安裝所需的源文件的有效位置。目標服務器的計算機帳戶必須能夠訪問該位置。…

Java High CPU故障排除指南–第1部分

本文是該系列的第1部分&#xff0c;它將為您提供有關如何進行故障排除和識別Java高CPU問題根本原因的綜合指南。 該指南也適用于獨立的Java程序&#xff0c;但旨在幫助涉及Java EE企業日常生產支持的個人。 它還將包括最常見的高級CPU問題列表以及高級解決方案。 生產問題解決…

PHP數據結構之三 線性表中的單鏈表的PHP實現

線性表的鏈式存儲&#xff1a;用一組任意的存儲單元存儲線性表中的數據元素。用這種方法存儲的線性表簡稱線性鏈表。 鏈式存儲線性表的特點&#xff1a;存儲鏈表中結點的一組任意的存儲單元可以是連續的&#xff0c;也可以是不連續的&#xff0c;甚至是零散分布在內存中的任意位…

php進程間通信 yoc_swoole的process模塊創建和使用子進程

swoole中為我們提供了一個進程管理模塊 Process&#xff0c;替換PHP的 pcntl 擴展&#xff0c;方便我們創建進程&#xff0c;管理進程&#xff0c;和進程間的通信。swoole提供了2種進程間的通信&#xff1a;1、基于 unix socket 的管道 pipe。2、基于 sysvmsg 的消息隊列。我們…

ajax回復留言,Ajax 留言板模擬

這一節我們利用 Ajax 制作一個留言板模擬&#xff0c;之所以叫模擬&#xff0c;是由于沒有將留言內容存入數據庫&#xff0c;而只是假像地處理&#xff0c;因為這里著重討論 Ajax&#xff0c;暫時就不涉及數據庫操作。這里我們模擬了留言失敗的情況&#xff0c;每次提交有 50% …

RabbitMQ:計劃郵件傳遞

本月初&#xff0c;我在ComoRichWeb上的RabbitMQ上做了一個演講&#xff0c;與會人員提出的一個問題是“是否可以發布一條消息供以后使用&#xff1f;” 我回答說&#xff0c;就我所知&#xff0c;這是不可能的&#xff0c;但是可能會有一些技巧來實現它。 好吧&#xff0c;今天…

mysqls壓力測試怎么用_阿里研究員:測試穩定性三板斧,我怎么用?

阿里妹導讀&#xff1a;如何治理測試穩定性問題&#xff1f;很多人會說&#xff1a;環境、流程管控、監控、工具化、加機器、專人負責、等等。這些都是對的。不過這些都是解決方案層面的&#xff0c;而不是方法論和理論體系層面的。今天&#xff0c;阿里研究員鄭子穎來說說測試…

HttpModule與HttpHandler詳解

ASP.NET對請求處理的過程&#xff1a;當請求一個*.aspx文件的時候&#xff0c;這個請求會被inetinfo.exe進程截獲&#xff0c;它判斷文件的后綴&#xff08;aspx&#xff09;之后&#xff0c;將這個請求轉交給 ASPNET_ISAPI.dll&#xff0c;ASPNET_ISAPI.dll會通過http管道&…

【iOS開發】---- 強大的UI修改工具 UIAppearance-有圖片效果

iOS5及其以后提供了一個比較強大的工具UIAppearance&#xff0c;可以輕松的統一你的界面&#xff0c;它提供如下兩個方法&#xff1a; (id)appearance (id)appearanceWhenContainedIn:(Class <>)ContainerClass,... 第一個方法是統一全部改&#xff0c;比如你設置UINav…