在這一點上,您應該知道線程如何與Java EE容器交互以及什么是線程轉儲。 在深入探究分析模式之前,您還需要了解IBM VM Thread Dump格式,因為這是在IBM VM上使用IBM WAS時期望的典型Thread Dump數據。
IBM VM線程轉儲故障概覽
為了使您更好地理解,請在下面的圖表中向您展示IBM 1.6 VM線程轉儲及其常見數據點的可視分類:

您可以從HotSpot VM線程轉儲中找到其他多余的運行時數據。 請記住,您可能不需要檢查所有這些數據點,但是您仍然需要了解根據問題情況可用的數據。 本文的其余部分將更詳細地介紹每個線程轉儲部分。
#線程轉儲生成事件
第一部分為您提供有關如何生成此線程轉儲的詳細信息。 IBM Thread Dump可以由“信號3”或“用戶”生成,例如kill -3 <Java pid>,也可以由嚴重的JVM條件(例如OutOfMemoryError)自動生成。
0SECTION TITLE subcomponent dump routineNULL ===============================1TISIGINFO Dump Event "user" (00004000) received 1TIDATETIME Date: 2012/03/12 at 20:52:131TIFILENAME Javacore filename: /apps/wl11g/domains/app/javacore.20120312.205205.1949928.0004.txt1TIREQFLAGS Request Flags: 0x81 (exclusive+preempt)1TIPREPSTATE Prep State: 0x4 (exclusive_vm_access)0SECTION TITLE subcomponent dump routineNULL ===============================1TISIGINFO OUTOFMEMORY received 1TIDATETIME Date: 2012/06/01 at 09:52:121TIFILENAME Javacore filename: /usr/WebSphere/AppServer/javacore311328.1338524532.txt
#硬件和操作系統環境詳細信息
下一部分為您提供了有關此IBM VM所運行的當前硬件和操作系統的一些詳細信息:
0SECTION GPINFO subcomponent dump routineNULL ================================2XHOSLEVEL OS Level : AIX 5.32XHCPUS Processors -3XHCPUARCH Architecture : ppc643XHNUMCPUS How Many : 63XHNUMASUP NUMA is either not supported or has been disabled by user
#JRE詳細信息和Java啟動參數
本節非常有用,因為它為您提供了有關JRE主版本和補丁程序級別以及所有JVM啟動參數的完整視圖。
0SECTION ENVINFO subcomponent dump routineNULL =================================1CIJAVAVERSION JRE 1.6.0 IBM J9 2.4 AIX ppc64-64 build jvmap6460sr9-20101124_692951CIVMVERSION VM build 20101124_0692951CIJITVERSION JIT enabled, AOT enabled - r9_20101028_17488ifx21CIGCVERSION GC - 20101027_AA1CIRUNNINGAS Running as a standalone JVM…………………………………………………………………………………………
#用戶和環境變量
本節為您提供了當前用戶和環境變量的列表,例如文件描述符限制。
1CIUSERLIMITS User Limits (in bytes except for NOFILE and NPROC)NULL ------------------------------------------------------------------------NULL type soft limit hard limit2CIUSERLIMIT RLIMIT_AS unlimited unlimited2CIUSERLIMIT RLIMIT_CORE 1073741312 unlimited2CIUSERLIMIT RLIMIT_CPU unlimited unlimited2CIUSERLIMIT RLIMIT_DATA unlimited unlimited2CIUSERLIMIT RLIMIT_FSIZE unlimited unlimited2CIUSERLIMIT RLIMIT_NOFILE 4096 40962CIUSERLIMIT RLIMIT_RSS 33554432 unlimited2CIUSERLIMIT RLIMIT_STACK 33554432 4294967296
#Java堆詳細信息和GC歷史記錄
與HotSpot VM 1.6+相似,IBM VM線程轉儲還包含有關Java堆容量和利用率的信息,以及為Java進程的每個內存空間分配的內存段。
請記住,更深入的Java堆分析將需要您按照以下教程分析堆轉儲二進制快照。 http://javaeesupportpatterns.blogspot.com/2011/02/ibm-sdk-heap-dump-httpsession-footprint.html
最后,還介紹了垃圾回收過程的歷史。
0SECTION MEMINFO subcomponent dump routineNULL =================================1STHEAPFREE Bytes of Heap Space Free: 51104BC8 1STHEAPALLOC Bytes of Heap Space Allocated: 800000001STSEGTYPE Internal Memory…………………………………………………………………………………………1STSEGTYPE Object Memory…………………………………………………………………………………………1STSEGTYPE Class Memory…………………………………………………………………………………………1STSEGTYPE JIT Code Cache…………………………………………………………………………………………1STSEGTYPE JIT Data Cache…………………………………………………………………………………………STGCHTYPE GC History 3STHSTTYPE 00:52:07:523048405 GMT j9mm.51 - SystemGC end:
newspace=466136480/483183616 oldspace=899251600/1610612736 loa=80530432/80530432 3STHSTTYPE 00:52:07:523046694 GMT j9mm.139 - Reference count end: weak=40149
soft=87504 phantom=33 threshold=17 maxThreshold=32 3STHSTTYPE 00:52:07:522164027 GMT j9mm.91 - GlobalGC end: workstackoverflow=0
overflowcount=0 weakrefs=40149 soft=87504 threshold=17 phantom=33 finalizers=4947
newspace=466136480/483183616 oldspace=899251600/1610612736 loa=80530432/80530432 3STHSTTYPE 00:52:07:522152764 GMT j9mm.90 - GlobalGC collect complete
#Java和JVM對象監視器的鎖和死鎖詳細信息
此線程轉儲部分非常重要。 線程問題經常涉及線程由于特定對象監視器上的鎖而在彼此之間等待,例如線程B等待獲取線程A持有的對象監視器上的鎖。死鎖條件還可以不時觸發;例如, 特別是對于非線程安全的實現。
IBM VM線程轉儲提供了一個單獨的部分,您可以在其中分析每個線程持有的鎖,包括等待鏈,例如,許多線程正在等待獲取相同的對象監視器鎖。
0SECTION LOCKS subcomponent dump routineNULL ===============================NULL 1LKPOOLINFO Monitor pool info:2LKPOOLTOTAL Current total number of monitors: 1034NULL 1LKMONPOOLDUMP Monitor Pool Dump (flat & inflated object-monitors):2LKMONINUSE sys_mon_t:0x0000000115B53060 infl_mon_t: 0x0000000115B530A0:3LKMONOBJECT java/util/Timer$TimerImpl@0x0700000000C92AA0/0x0700000000C92AB8: <unowned>3LKNOTIFYQ Waiting to be notified:3LKWAITNOTIFY "Thread-7" (0x0000000114CAB400)…………………………………………………………………………## Threads waiting chain2LKMONINUSE sys_mon_t:0x000000012462FE00 infl_mon_t: 0x000000012462FE40:3LKMONOBJECT com/inc/server/app/Request@0x07000000142ADF30/0x07000000142ADF48: owner "Thread-30" (0x000000012537F300), entry count 13LKNOTIFYQ Waiting to be notified:3LKWAITNOTIFY "Thread-26" (0x0000000125221F00)3LKWAITNOTIFY "Thread-27" (0x0000000125252000)3LKWAITNOTIFY "Thread-28" (0x000000012527B800)3LKWAITNOTIFY "Thread-29" (0x00000001252DDA00)3LKWAITNOTIFY "Thread-31" (0x0000000125386200)3LKWAITNOTIFY "Thread-32" (0x0000000125423600)3LKWAITNOTIFY "Thread-33" (0x000000012548C500)3LKWAITNOTIFY "Thread-34" (0x00000001255D6000)3LKWAITNOTIFY "Thread-35" (0x00000001255F7900)…………………………………………………………………………
#Java EE中間件,第三方和自定義應用程序線程
與HotSpot VM線程轉儲格式相似,此部分是線程轉儲的核心,通常您將在其中花費大部分分析時間。 找到的線程數將取決于您使用的中間件軟件,第三方庫(可能具有其自己的線程)和您的應用程序( 如果創建任何自定義線程,通常不是最佳實踐 )。
在下面的示例中,以下線程處于BLOCK狀態,這通常意味著它正在等待獲取對象監視器上的鎖。 您將需要在前面的部分中進行搜索,并確定哪個線程持有該鎖,以便您可以查明根本原因。
3XMTHREADINFO "[STUCK] ExecuteThread: '162' for queue: 'weblogic.kernel.Default
(self-tuning)'" J9VMThread:0x000000013ACF0800, j9thread_t:0x000000013AC88B20,
java/lang/Thread:0x070000001F945798, state:B, prio=13XMTHREADINFO1 (native thread ID:0x1AD0F3, native priority:0x1, native
policy:UNKNOWN)3XMTHREADINFO3 Java callstack:4XESTACKTRACE at org/springframework/jms/connection/SingleConnectionFactory.createConnection(SingleConnectionFactory.java:207(Compiled Code))4XESTACKTRACE at org/springframework/jms/connection/SingleConnectionFactory.createQueueConnection(SingleConnectionFactory.java:222(Compiled Code))4XESTACKTRACE at org/springframework/jms/core
/JmsTemplate102.createConnection(JmsTemplate102.java:169(Compiled Code))4XESTACKTRACE at org/springframework/jms/core
/JmsTemplate.execute(JmsTemplate.java:418(Compiled Code))4XESTACKTRACE at org/springframework/jms
/core/JmsTemplate.send(JmsTemplate.java:475(Compiled Code))4XESTACKTRACE at org/springframework/jms
/core/JmsTemplate.send(JmsTemplate.java:467(Compiled Code))…………………………………………………………………………………………………………
#JVM類加載器摘要
最后,IBM VM Thread Dump的最后一部分為您提供了詳細的類加載器摘要。 在處理與Class Loader相關的問題和泄漏時,這是非常關鍵的數據。 您將在運行的JVM中找到每個活動Class loader的已加載Class的數量和類型。
我建議您閱讀以下案例研究,以獲取有關如何在使用IBM VM時查明此類問題的根本原因的完整教程。
http://javaeesupportpatterns.blogspot.com/2011/04/class-loader-memory-leak-debugging.html
0SECTION CLASSES subcomponent dump routineNULL =================================1CLTEXTCLLOS Classloader summaries1CLTEXTCLLSS 12345678: 1=primordial,2=extension,3=shareable
,4=middleware,5=system,6=trusted,7=application,8=delegating2CLTEXTCLLOADER p---st-- Loader *System*(0x0700000000878898)3CLNMBRLOADEDLIB Number of loaded libraries 63CLNMBRLOADEDCL Number of loaded classes 37212CLTEXTCLLOADER -x--st-- Loader sun/misc
/Launcher$ExtClassLoader(0x0700000000AE8F40), Parent *none*(0x0000000000000000)3CLNMBRLOADEDLIB Number of loaded libraries 03CLNMBRLOADEDCL Number of loaded classes 912CLTEXTCLLOADER -----ta- Loader sun/misc/Launcher$AppClassLoader(0x07000000008786D0)
, Parent sun/misc/Launcher$ExtClassLoader(0x0700000000AE8F40)3CLNMBRLOADEDLIB Number of loaded libraries 33CLNMBRLOADEDCL Number of loaded classes 15178……………………………………………………………………………………………
我希望本文有助于理解IBM VM線程轉儲的基本視圖。 下一篇文章(第5部分)將通過一步一步的教程和我在過去十年中使用的技術為您提供有關如何分析JVM線程轉儲的教程。
參考: 如何分析線程轉儲–第4部分: Java EE支持模式和Java教程博客上的JCG合作伙伴 Pierre-Hugues Charbonneau提供的IBM VM 。
翻譯自: https://www.javacodegeeks.com/2012/06/how-to-analyze-thread-dump-ibm-vm.html