如何分析线程转储– IBM VM

本文是我们的线程转储分析系列的第4部分,它将为您概述什么是IBM VM的JVM线程转储以及您将找到的不同线程和数据点。 您将看到和学习​​到,IBM VM Thread Dump格式是不同的,但是提供了更多现成的故障排除数据。

在这一点上,您应该知道线程如何与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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值