在这一点上,您应该知道线程如何与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 routine
NULL ===============================
1TISIGINFO Dump Event "user" (00004000) received
1TIDATETIME Date: 2012/03/12 at 20:52:13
1TIFILENAME Javacore filename: /apps/wl11g/domains/app/javacore.20120312.205205.1949928.0004.txt
1TIREQFLAGS Request Flags: 0x81 (exclusive+preempt)
1TIPREPSTATE Prep State: 0x4 (exclusive_vm_access)
0SECTION TITLE subcomponent dump routine
NULL ===============================
1TISIGINFO OUTOFMEMORY received
1TIDATETIME Date: 2012/06/01 at 09:52:12
1TIFILENAME Javacore filename: /usr/WebSphere/AppServer/javacore311328.1338524532.txt
#硬件和操作系统环境详细信息
下一部分为您提供了有关此IBM VM所运行的当前硬件和操作系统的一些详细信息:
0SECTION GPINFO subcomponent dump routine
NULL ================================
2XHOSLEVEL OS Level : AIX 5.3
2XHCPUS Processors -
3XHCPUARCH Architecture : ppc64
3XHNUMCPUS How Many : 6
3XHNUMASUP NUMA is either not supported or has been disabled by user
#JRE详细信息和Java启动参数
本节非常有用,因为它为您提供了有关JRE主版本和补丁程序级别以及所有JVM启动参数的完整视图。
0SECTION ENVINFO subcomponent dump routine
NULL =================================
1CIJAVAVERSION JRE 1.6.0 IBM J9 2.4 AIX ppc64-64 build jvmap6460sr9-20101124_69295
1CIVMVERSION VM build 20101124_069295
1CIJITVERSION JIT enabled, AOT enabled - r9_20101028_17488ifx2
1CIGCVERSION GC - 20101027_AA
1CIRUNNINGAS Running as a standalone JVM
…………………………………………………………………………………………
#用户和环境变量
本节为您提供了当前用户和环境变量的列表,例如文件描述符限制。
1CIUSERLIMITS User Limits (in bytes except for NOFILE and NPROC)
NULL
------------------------------------------------------------------------
NULL type soft limit hard limit
2CIUSERLIMIT RLIMIT_AS unlimited unlimited
2CIUSERLIMIT RLIMIT_CORE 1073741312 unlimited
2CIUSERLIMIT RLIMIT_CPU unlimited unlimited
2CIUSERLIMIT RLIMIT_DATA unlimited unlimited
2CIUSERLIMIT RLIMIT_FSIZE unlimited unlimited
2CIUSERLIMIT RLIMIT_NOFILE 4096 4096
2CIUSERLIMIT RLIMIT_RSS 33554432 unlimited
2CIUSERLIMIT 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 routine
NULL =================================
1STHEAPFREE Bytes of Heap Space Free: 51104BC8
1STHEAPALLOC Bytes of Heap Space Allocated: 80000000
1STSEGTYPE 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 routine
NULL ===============================
NULL
1LKPOOLINFO Monitor pool info:
2LKPOOLTOTAL Current total number of monitors: 1034
NULL
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 chain
2LKMONINUSE sys_mon_t:0x000000012462FE00 infl_mon_t: 0x000000012462FE40:
3LKMONOBJECT com/inc/server/app/Request@0x07000000142ADF30/0x07000000142ADF48:
owner "Thread-30" (0x000000012537F300), entry count 1
3LKNOTIFYQ 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=1
3XMTHREADINFO1 (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 routine
NULL =================================
1CLTEXTCLLOS Classloader summaries
1CLTEXTCLLSS 12345678: 1=primordial,2=extension,3=shareable
,4=middleware,5=system,6=trusted,7=application,8=delegating
2CLTEXTCLLOADER p---st-- Loader *System*(0x0700000000878898)
3CLNMBRLOADEDLIB Number of loaded libraries 6
3CLNMBRLOADEDCL Number of loaded classes 3721
2CLTEXTCLLOADER -x--st-- Loader sun/misc
/Launcher$ExtClassLoader(0x0700000000AE8F40), Parent *none*(0x0000000000000000)
3CLNMBRLOADEDLIB Number of loaded libraries 0
3CLNMBRLOADEDCL Number of loaded classes 91
2CLTEXTCLLOADER -----ta- Loader sun/misc/Launcher$AppClassLoader(0x07000000008786D0)
, Parent sun/misc/Launcher$ExtClassLoader(0x0700000000AE8F40)
3CLNMBRLOADEDLIB Number of loaded libraries 3
3CLNMBRLOADEDCL 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