JVM:如何分析線程轉儲

本文將教您如何分析JVM線程轉儲,并查明問題的根本原因。 從我的角度來看,線程轉儲分析是掌握Java EE生產支持的任何個人最重要的技能。 您可以從線程轉儲快照中獲取的信息量通常遠遠超出您的想象。

我的目標是與您分享我在過去10年中積累的有關線程轉儲分析的知識,例如數百個線程轉儲分析周期以及許多JVM版本和JVM供應商之間的數十種常見問題模式。

請為此頁面添加書簽,并隨時關注每周的文章。
也請隨時與您的工作同事和朋友分享此Thread Dump培訓計劃。

聽起來不錯,我真的需要提高我的Thread Dump技能……那么我們從哪里開始呢?

我向您提出的是一個完整的“線程轉儲”培訓計劃。 將涵蓋以下項目。 我還將為您提供現實的線程轉儲示例,您可以學習和理解。

1)線程轉儲概述和基礎知識
2)線程轉儲生成技術和可用工具
3)Sun HotSpot,IBM JRE和Oracle JRockit之間的線程轉儲格式差異 4)線程堆棧跟蹤的解釋和解釋 5)線程轉儲分析和相關技術 6)線程轉儲常見問題模式(線程爭用,死鎖,掛起IO調用,垃圾回收/ OutOfMemoryError問題,無限循環等) 7)通過實際案例研究得出的線程轉儲示例

我真的希望這個線程轉儲分析培訓計劃對您有所幫助,所以請繼續關注每周更新和文章!

但是,如果我仍然有疑問或仍在努力理解這些培訓文章怎么辦?

不用擔心,請考慮我為您的培訓師。 我強烈建議您向我提問關于Thread Dump的任何問題請記住,沒有愚蠢的問題 ),因此,我免費為您提供以下選擇; 只需選擇您更熟悉的通信模型即可:

1)通過在文章下方發布您的評論來提交與主題轉儲相關的問題( 請隨時保持匿名
2)將線程轉儲數據提交到根本原因分析論壇
3)給我發電子郵件與您的主題轉儲相關的問題@ phcharbonneau@hotmail.com

我可以從生產環境/服務器向您發送線程轉儲數據嗎?

是的,如果您希望討論問題的根本原因,請隨時通過電子郵件或“ 根本原因分析”論壇將您生成的線程轉儲數據發送給我。 現實生活中的線程轉儲分析始終是最好的學習方法。

我真的希望您會喜歡并分享此線程轉儲分析培訓計劃。 我將盡力為您提供優質的材料和任何問題的答案。

在深入研究線程轉儲分析和問題模式之前,了解基礎知識非常重要。 該文章將介紹基礎知識,并讓您更好地與Java EE容器進行JVM和中間件交互。

Java VM概述

Java虛擬機實際上是任何Java EE平臺的基礎。 這是您的中間件和應用程序已部署并處于活動狀態的地方。

JVM為中間件軟件和Java / Java EE程序提供以下功能:

– Java / Java EE程序的運行時環境(字節碼格式)
–幾個程序功能和實用程序(IO設施,數據結構,線程管理,安全性,監視等)
–通過垃圾回收器動態分配和管理內存

您的JVM可以駐留在許多操作系統(Solaris,AIX,Windows等)上,并且根據您的物理服務器規格,您可以為每個物理/虛擬服務器安裝1…n個JVM進程。

JVM和中間件軟件交互

在下面找到一個圖,該圖向您顯示JVM,中間件和應用程序之間的高級交互視圖。

這向您展示了JVM,中間件和應用程序之間的典型且簡單的交互圖。 如您所見,標準Java EE應用程序的線程分配主要在中間件內核本身和JVM之間完成( 當應用程序本身或某些API直接創建線程時會有一些例外,但這并不常見,必須非常小心地完成 ) 。

另外,請注意,某些線程是在JVM自身內部進行管理的,例如GC(垃圾收集)線程,以便處理并發垃圾收集。

由于大多數線程分配是由Java EE容器完成的,因此了解并識別線程堆棧跟蹤并從線程轉儲數據中正確識別它很重要,這一點很重要。 這將使您快速了解Java EE容器嘗試執行的請求的類型。

從線程轉儲分析的角度,您將學習如何區分從JVM找到的不同線程池并確定請求類型。

最后一部分將為您概述什么是HotSpot VM的JVM線程轉儲以及您將找到的不同線程。 第4部分將提供IBM VM線程轉儲格式的詳細信息。

請注意,您可以從根本原因分析論壇中找到本文使用的線程轉儲示例。

JVM線程轉儲–這是什么?

JVM線程轉儲是在給定時間拍攝的快照,可為您提供所有已創建的Java線程的完整列表。

找到的每個單獨的Java線程都會為您提供以下信息:

線程名稱 ; 通常由中間件供應商用于標識線程ID及其關聯的線程池名稱和狀態(運行,阻塞等)。

線程類型和優先級,例如: 守護程序prio = 3 **中間件軟件通常將其線程創建為守護程序,這意味著它們的線程在后臺運行; 向用戶提供服務,例如您的Java EE應用程序**

Java線程ID,例如: tid = 0x000000011e52a800 **這是通過java.lang.Thread.getId()獲得的Java線程ID,通常以自動遞增long 1..n **的形式實現

–本機線程ID,例如: nid = 0x251c **作為本機線程ID的重要信息,您可以關聯例如從OS角度來看哪個線程在JVM中使用最多的CPU等。

Java線程狀態和詳細信息,例如: 等待監視器條目[0xfffffffea5afb000] java.lang.Thread.State:已阻止(在對象監視器上)
**允許快速了解線程狀態及其潛在的電流阻塞條件**

Java線程堆棧跟蹤 ; 這是迄今為止從線程轉儲中找到的最重要的數據。 這也是您將花費大部分時間的地方,因為Java Stack Trace為您提供了90%的信息,以便查明許多問題模式類型的根本原因,您將在稍后的培訓課程中學習

Java堆故障 ; 從HotSpot VM 1.6開始,您還將在“線程轉儲”快照的底部找到HotSpot內存空間利用率的細目分類,例如Java堆(YoungGen,OldGen)和PermGen空間。 當懷疑過多的GC是可能的根本原因時,此功能非常有用,因此您可以對找到的線程數據/模式進行開箱即用的關聯

Heap
PSYoungGen      total 466944K, used 178734K [0xffffffff45c00000, 0xffffffff70800000, 0xffffffff70800000)
eden space 233472K, 76% used [0xffffffff45c00000,0xffffffff50ab7c50,0xffffffff54000000)
from space 233472K, 0% used [0xffffffff62400000,0xffffffff62400000,0xffffffff70800000)
to   space 233472K, 0% used [0xffffffff54000000,0xffffffff54000000,0xffffffff62400000)
PSOldGen        total 1400832K, used 1400831K [0xfffffffef0400000, 0xffffffff45c00000, 0xffffffff45c00000)
object space 1400832K, 99% used [0xfffffffef0400000,0xffffffff45bfffb8,0xffffffff45c00000)
PSPermGen       total 262144K, used 248475K [0xfffffffed0400000, 0xfffffffee0400000, 0xfffffffef0400000)
object space 262144K, 94% used [0xfffffffed0400000,0xfffffffedf6a6f08,0xfffffffee0400000)

線程轉儲故障概覽

為了使您更好地理解,請在下面的圖表中直觀地查看HotSpot VM線程轉儲及其常見的線程池:

您可以從HotSpot VM線程轉儲中找到一些信息。 根據您的問題模式,其中一些功能比其他功能更重要(問題模式將在以后的文章中進行模擬和解釋)。

現在,根據我們的示例 HotSpot線程轉儲,在下面找到每個線程轉儲部分的詳細說明:

#全線程轉儲標識符
基本上,這是唯一的關鍵字,一旦生成線程轉儲(例如:對于UNIX,通過kill -3 <PID>),您就會在中間件/標準Java輸出日志中找到該關鍵字。 這是“線程轉儲”快照數據的開始。

Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.0-b11 mixed mode):

#Java EE中間件,第三方和自定義應用程序線程
這部分是線程轉儲的核心,通常您將在其中花費大部分分析時間。 找到的線程數將取決于您使用的中間件軟件,第三方庫(可能具有其自己的線程)和您的應用程序( 如果創建任何自定義線程,通常不是最佳實踐 )。

在我們的示例線程轉儲中,Weblogic是所使用的中間件。 從Weblogic 9.2開始,使用具有唯一標識符“'weblogic.kernel.Default(自我調整)”的自我調整線程池。

"[STANDBY] ExecuteThread: '414' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=3 tid=0x000000010916a800 nid=0x2613 in Object.wait() [0xfffffffe9edff000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0xffffffff27d44de0> (a weblogic.work.ExecuteThread)at java.lang.Object.wait(Object.java:485)at weblogic.work.ExecuteThread.waitForRequest(ExecuteThread.java:160)- locked <0xffffffff27d44de0> (a weblogic.work.ExecuteThread)at weblogic.work.ExecuteThread.run(ExecuteThread.java:181)

#HotSpot VM線程
這是由HotSpot VM管理的內部線程,以執行內部本機操作。 通常,除非看到較高的CPU(通過線程轉儲和prstat /本機線程ID相關性),否則您不必擔心這一點。

"VM Periodic Task Thread" prio=3 tid=0x0000000101238800 nid=0x19 waiting on condition

#HotSpot GC線程
當使用HotSpot并行GC時(在使用多物理核心硬件時,這很普遍),默認情況下或根據JVM調整一定數量的GC線程,HotSpot VM會創建。 這些GC線程允許VM以并行方式執行其定期GC清理,從而總體上減少了GC時間。 以增加CPU利用率為代價。

"GC task thread#0 (ParallelGC)" prio=3 tid=0x0000000100120000 nid=0x3 runnable
"GC task thread#1 (ParallelGC)" prio=3 tid=0x0000000100131000 nid=0x4 runnable
………………………………………………………………………………………………………………………………………………………………

這也是至關重要的數據,因為當面臨與GC相關的問題(例如過多的GC,內存泄漏等)時,您將能夠使用其本機id值(nid)將從OS / Java進程觀察到的任何高CPU與這些線程相關聯= 0x3)。 您將在以后的文章中學習如何識別和確認此問題。

#JNI全局引用計數
JNI(Java本機接口)全局引用基本上是從本機代碼到Java垃圾收集器管理的Java對象的對象引用。 其作用是防止收集本機代碼仍在使用但技術上在Java代碼中沒有“實時”引用的對象。

監視JNI引用以檢測與JNI相關的泄漏也很重要。 如果您直接使用JNI進行編程,或者使用易于發生本機內存泄漏的第三方工具(例如監視工具)進行編程,則可能會發生這種情況。

JNI global references: 1925

#Java堆利用率視圖
此數據已添加回JDK 1 .6,并為您提供了HotSpot Heap的簡短快速視圖。 我發現在與GC相關的問題以及HIGH CPU一起進行故障排除時,它非常有用,因為您可以在單個快照中同時獲得線程轉儲和Java堆,從而可以確定(或排除)特定Java堆內存空間中的任何壓力點以及當前當時正在執行線程計算。 正如您在示例線程轉儲中所看到的,Java堆OldGen已被最大化!

HeapPSYoungGen      total 466944K, used 178734K [0xffffffff45c00000, 0xffffffff70800000, 0xffffffff70800000)eden space 233472K, 76% used [0xffffffff45c00000,0xffffffff50ab7c50,0xffffffff54000000)from space 233472K, 0% used [0xffffffff62400000,0xffffffff62400000,0xffffffff70800000)to   space 233472K, 0% used [0xffffffff54000000,0xffffffff54000000,0xffffffff62400000)PSOldGen        total 1400832K, used 1400831K [0xfffffffef0400000, 0xffffffff45c00000, 0xffffffff45c00000)object space 1400832K, 99% used [0xfffffffef0400000,0xffffffff45bfffb8,0xffffffff45c00000)PSPermGen       total 262144K, used 248475K [0xfffffffed0400000, 0xfffffffee0400000, 0xfffffffef0400000)object space 262144K, 94% used [0xfffffffed0400000,0xfffffffedf6a6f08,0xfffffffee0400000)

我希望本文有助于理解HotSpot VM線程轉儲的基本視圖。下一篇文章將為您提供與IBM VM相同的線程轉儲概述和細分。

請隨時發表任何評論或問題。

參考: 如何分析線程轉儲–第1部分 , ? 如何分析線程轉儲–第2部分:JVM概述和 如何分析線程轉儲–第3部分: 來自JCG合作伙伴的 HotSpot VM ? “ Java EE支持模式和Java教程”博客上的Pierre-Hugues Charbonneau。


翻譯自: https://www.javacodegeeks.com/2012/03/jvm-how-to-analyze-thread-dump.html

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

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

相關文章

極光推送JPush的快速集成

首先到極光推送的官網上創建一個應用&#xff0c;填寫對應的應用名和包名。 創建好之后下載Demo 提取Sdk里面的圖片和xml等資源文件放自己項目的相應位置&#xff0c;然后要注意的是.so文件的放置位置&#xff1a; 在main目錄下新建一個jniLibs文件夾&#xff0c;放在這個文件夾…

c遺傳算法的終止條件一般_Matlab2 :Matlab遺傳算法(GA)優4~-r-具箱是基于基本操作 聯合開發網 - pudn.com...

Matlab2所屬分類&#xff1a;matlab例程開發工具&#xff1a;PDF文件大小&#xff1a;115KB下載次數&#xff1a;76上傳日期&#xff1a;2007-09-07 20:04:29上 傳 者&#xff1a;錢廣說明&#xff1a; &#xff1a;Matlab遺傳算法(GA)優4~-r-具箱是基于基本操作及終止條件、二…

用程序輸出表格

做應用程序的時候經常需要輸出excel表格&#xff0c;除了不同語言接口完善程度不同的麻煩以及要添加各種外部引用的麻煩之外還要考慮應用環境不同的office版本的問題&#xff0c;實在麻煩 當只需要輸出數據&#xff0c;不管顏色什么的的話&#xff0c;有個避免上述麻煩的辦法就…

elk系列1之入門安裝與基本操作

preface 我們每天都要查看服務器的日志&#xff0c;一方面是為了開發的同事翻找日志&#xff0c;另一方面是巡檢服務器查看日志&#xff0c;而隨著服務器數量以及越來越多的業務上線&#xff0c;日志越來越多&#xff0c;人肉運維相當痛苦了&#xff0c;此時&#xff0c;參考現…

Java 7 –反編譯項目硬幣

大家好&#xff0c;該是從2012年開始寫作的時候了。正如您在其他博客中可能已經看到的那樣&#xff0c;有一些更改可以使您使用Java編程時的開發人員生活變得更加輕松&#xff1a;Diamond運算符&#xff0c;Switchs中的Strings&#xff0c;嘗試使用資源&#xff0c;多次捕獲等 …

git安裝后找不見版本_無法安裝最新版本的Gitlab

這個問題不是代碼,而是Gitlab的安裝.我現在試圖安裝Gitlab幾天沒有成功.實際上,很久以前,他們提出了使用wget的方法非常好,但由于我們必須使用Curl的方法,所以不可能比下載更進一步.在Ubuntu 14.04機器上,以下命令有效&#xff1a;curl https://packages.gitlab.com/install/re…

在Excel表里面插入背景圖

工作中我們會經常用到MS Excel&#xff0c;通常我們打開MS Excel&#xff0c;里面的工作表都是空白單調的背景。當然了&#xff0c;MS Excel可以在工作簿里面插入背景圖片。那么問題來了&#xff0c;如果你沒有安裝Microsoft Office&#xff0c;該如何在Excel文件里面插入好看的…

Java 7:復制和移動文件和目錄

這篇文章是我關于Java 7 java.nio.file軟件包的系列文章的繼續&#xff0c;這次涵蓋了文件的復制和移動以及完整的目錄樹。 如果您曾經對Java缺少copy和move方法感到沮喪&#xff0c;那么請繼續閱讀&#xff0c;以免麻煩。 涵蓋范圍中包括非常有用的Files.walkFileTree方法。 但…

java 五子棋項目_Java項目如何實現五子棋小游戲

Java項目如何實現五子棋小游戲發布時間&#xff1a;2020-07-21 14:53:06來源&#xff1a;億速云閱讀&#xff1a;77作者&#xff1a;小豬小編這次要給大家分享的是Java項目如何實現五子棋小游戲&#xff0c;文章內容豐富&#xff0c;感興趣的小伙伴可以來了解一下&#xff0c;希…

Java中多線程的使用!!

簡介&#xff1a; 1.要了解多線程&#xff0c;首先我們得先了解進程和線程。那么什么是進程&#xff1f;進程就是一個正在運行的程序分配內存讓應用程序能夠運行的叫做進程。那么什么又是線程呢&#xff1f;線程&#xff1a;在一個程序中&#xff0c;負責代碼的執行&#xff0c…

java pkcs1轉pkcs8_pkcs1與pkcs8格式RSA私鑰互相轉換

1、PKCS1私鑰生成openssl genrsa -out private.key 1024private.key文件內容如下&#xff1a;-----BEGIN RSA PRIVATE KEY-----MIICXQIBAAKBgQDREk3uy4x9i4a16OYOYEp5Ir2f16lsmUHB2HjGDlxkU0ju9YApyeZlUXb191ZkxJ2vx2vKppN4gKLDy5r7JMTpwch1CNvceySX6DiM4lwTAnUEZiBYgNBNrKINEt…

嵌入式碼頭,Vaadin和焊接

當我開發Web應用程序時&#xff0c;我希望能夠從Eclipse快速啟動它們&#xff0c;而不必依賴各種重量級的tomcat或glassfish插件。 因此&#xff0c;我通常要做的只是創建一個可以直接從Eclipse運行的基于Java的簡單啟動器。 該啟動器會在幾秒鐘內啟動&#xff0c;因此使開發工…

創建真機調試證書(蘋果開發者平臺各個選項對應的含義)

創建真機調試證書&#xff08;蘋果開發者平臺各個選項對應的含義&#xff09; 原文地址&#xff1a;http://jingyan.baidu.com/article/ff411625b8141312e48237a7.html轉載于:https://www.cnblogs.com/siasyl/p/5340593.html

gl.vertexAtteib3f P42 講數據傳給location參數指定的attribute變量

參數  location  指定將要修改的attribute變量存儲位置 v0  指定填充attribute變量第一個分量的值 v1  指定填充attribute變量第二個分量的值 v2  指定填充attribute變量第三個分量的值 var VSHADER_SOURCE attribute vec4 a_Position;\n void main(){\n gl_Posit…

將Spring集成到舊版應用程序中

所有Spring開發人員喜歡做的事情之一就是將Spring塞入他們正在工作的任何應用程序中–這是我生活中的罪惡感之一&#xff1a;您看到一些代碼&#xff0c;認為它是垃圾&#xff0c;因為它包含幾個眾所周知的反模式&#xff0c;然后想想如果這個應用程序是Spring應用程序會多么酷…

java自己實現ioc_springioc原理、springmvc項目分析、自己實現IOC

從一個面試題開始&#xff1a;你自己實現IOC容器的話&#xff0c;保存bean你會使用什么數據結構來保存呢&#xff1f;現在的很多開發人員(甚至3年以上的)不一定能回答這問題&#xff0c;為什么會這樣呢&#xff1f;這個跟現在springboot現在已經高度成熟了&#xff0c;很多配置…

實現兩級下拉框的聯動

1.實現兩級下拉框的聯動。 功能&#xff1a;實現點擊年級下拉框&#xff0c;加載對應科目的下拉框。 第一步&#xff1a;首先要加載年級下拉框中的數據。 01.在GradeDAL層&#xff08;數據訪問層&#xff09;寫一個方法&#xff0c;查詢所有年級的信息。 /// <summary>//…

System.nanoTime()背后是什么?

在Java世界中&#xff0c;對System.nanoTime&#xff08;&#xff09;的理解非常好。 總有一些人說它是快速&#xff0c;可靠的&#xff0c;并且在可能的情況下&#xff0c;應該使用它代替System.currentTimemillis&#xff08;&#xff09;進行計時。 總的來說&#xff0c;他絕…

python連接SQL Server取多個結果集:Pymssql模塊

基本的用法可以參考&#xff1a;python連接SQL Server&#xff1a;Pymssql模塊 和上一篇文章中的代碼&#xff0c;只取一個結果集不同&#xff0c;這次會一次運行2個sql語句&#xff0c;然后分別取出2個結果集&#xff0c;打印輸出。 代碼中有詳細的注釋&#xff0c;一看就明白…

狀態不屬于代碼

Web應用程序中的“狀態”是什么&#xff1f; 它就是要存儲的數據&#xff08;無論目的地是什么—內存&#xff0c;數據庫&#xff0c;文件系統&#xff09;。 應用程序本身不得在代碼中存儲任何狀態。 這意味著您的類應僅包含帶有無狀態對象的字段。 換句話說&#xff0c;在程序…