本文是“ 线程转储”分析系列的第5部分。 到目前为止,您已经了解了线程的基本原理以及它们与Java EE容器和JVM的交互。 您还学习了HotSpot和IBM Java VM的不同线程转储格式。 现在是您深入分析过程的时候了。

为了使您能够从线程转储中快速识别问题模式,首先需要了解如何读取线程堆栈跟踪以及如何正确获取“故事”。 这意味着,如果我要您告诉我#38线程在做什么? 您应该能够准确回答; 包括“线程堆栈跟踪”是否显示正常(正常)与挂起状态。

再谈Java堆栈跟踪

你们中的大多数人都熟悉Java堆栈跟踪。 当抛出Java异常时,这是我们从服务器和应用程序日志文件中找到的典型数据。 在这种情况下,Java堆栈跟踪为我们提供了触发Java异常的Thread的代码执行路径,例如java.lang.NoClassDefFoundError,java.lang.NullPpointerException等。此类代码执行路径使我们可以查看不同的层最终导致Java异常的代码。

必须始终从下至上读取Java堆栈跟踪:

  • 底部的行将显示请求的始发者,例如Java / Java EE容器Thread。
  • 堆栈跟踪顶部的第一行将向您显示触发了最后一个Exception的Java类。

让我们通过一个简单的示例来完成此过程。 我们创建了一个示例Java程序,只需执行一些Class方法调用并抛出Exception。 生成的程序输出如下:

JavaStrackTraceSimulator
Author: Pierre-Hugues Charbonneau
http://javaeesupportpatterns.blogspot.comException in thread "main" java.lang.IllegalArgumentException:at org.ph.javaee.training.td.Class2.call(Class2.java:12)at org.ph.javaee.training.td.Class1.call(Class1.java:14)at org.ph.javaee.training.td.JavaSTSimulator.main(JavaSTSimulator.java:20)
  • 调用Java程序JavaSTSimulator(通过“主”线程)
  • 然后,模拟器从Class1调用方法call()
  • 然后,Class1方法call()调用Class2方法call()
  • Class2方法call()引发Java异常:java.lang.IllegalArgumentException
  • 然后,在日志/标准输出中显示Java异常

如您所见,导致此异常的代码执行路径始终从下至上显示。

上面的分析过程对于任何Java程序员都应该是众所周知的。 接下来,您将看到线程转储线程堆栈跟踪分析过程与上述Java堆栈跟踪分析非常相似。

线程转储:线程堆栈跟踪分析

从JVM生成的线程转储为您提供了整个JVM进程中所有“创建的”线程的代码级执行快照。 创建线程并不意味着所有这些线程实际上都在做某事。 在从Java EE容器JVM生成的典型线程转储快照中:

  • 一些线程可能正在执行原始计算任务,例如XML解析,IO /磁盘访问等。
  • 一些线程可能正在等待一些阻塞的IO调用,例如远程Web服务调用,DB / JDBC查询等。
  • 那时某些线程可能涉及垃圾回收,例如GC线程
  • 一些线程将等待一些工作要做(不做任何工作的线程通常进入wait()状态)
  • 一些线程可能正在等待其他一些线程完成工作,例如,一些线程正在等待获取某些对象上的监视器锁定(同步块{})

在下一篇文章中,我将返回上面的更多图表,但现在让我们集中讨论堆栈跟踪分析过程。 您的下一个任务是能够尽您所能读取线程堆栈跟踪并了解它在做什么。

线程堆栈跟踪为您提供了其当前执行的快照。 第一行通常包含线程的本机信息,例如其名称,状态,地址等。当前执行堆栈跟踪必须自下而上读取。 请遵循以下分析过程。 您从线程转储分析中获得的经验越多,您就能越快地读取并快速识别每个线程执行的工作:

  • 从底部开始读取线程堆栈跟踪
  • 首先,确定发起者(Java EE容器线程,自定义线程,GC线程,JVM内部线程,独立的Java程序“主”线程等)。
  • 下一步是确定线程正在执行的请求的类型(WebApp,Web Service,JMS,远程EJB(RMI),内部Java EE容器等)。
  • 下一步是从执行堆栈中识别出您所涉及的应用程序模块的形式,例如,线程正在尝试执行的实际核心工作。 分析的复杂性将取决于中间件环境和应用程序的抽象层
  • 下一步是查看第一行之前的最后〜10-20行。 标识线程所涉及的协议或工作,例如HTTP调用,套接字通信,JDBC或原始计算任务,例如磁盘访问,类加载等。
  • 下一步是看第一行。 第一行通常告诉LOT处于Thread状态,因为它是您拍摄快照时执行的当前代码
  • 最后两个步骤的组合将为您提供信息的核心,以总结线程所涉及的工作和/或悬挂条件

现在,使用从JBoss 5生产环境捕获的Thread Dump Thread堆栈跟踪的真实示例,在下面直观地查看上述步骤。 在此示例中,许多线程在创建新的JAX-WS Service实例时都显示了类似的问题,即IO过多。

如您所见,最后10行和第一行将告诉我们线程所涉及的挂起或缓慢状态(如果有)。 底部的几行将为我们提供发起者和请求类型的详细信息。

我希望本文能帮助您了解正确的线程堆栈跟踪分析的重要性。 当我们在以后的文章中介绍最常见的线程转储问题模式时,我将带回更多的线程堆栈跟踪示例。 现在,下一篇文章将教您如何在逻辑孤岛中分解线程转储线程,并提出潜在的根本原因“可疑”列表。

参考: 如何分析线程转储–第5部分:来自JCG合作伙伴 Pierre-Hugues Charbonneau的Java EE支持模式和Java教程博客中的线程堆栈跟踪 。

翻译自: https://www.javacodegeeks.com/2012/07/how-to-analyze-thread-dump-thread-stack.html

如何分析线程转储–线程堆栈跟踪相关推荐

  1. 堆转储上的线程:_妖精陷阱:线程转储分析模式

    从细盐到复杂的宇宙,到处都有图案. 真实的模式可以承受时间. 在瞬息万变的世界中,它们是不变的. 它需要大量的辛勤工作,丰富的经验(包括好的和坏的),激光聚焦和毅力,才能使噪声结晶并创建图案. 幸运的 ...

  2. jmc线程转储_查找线程转储中的异常和错误

    jmc线程转储 线程转储是解决生产问题/调试生产问题的重要工件. 在像过去我们已经讨论了几种有效的线程转储故障模式: 堵车 , 跑步机 , RSI , 一个 LL条条大路通罗马 .......... ...

  3. linux分析jstack,jstack命令以及线程转储堆栈分析

    一.命令介绍 jstack是jdk自带的jvm分析工具,用于打印指定 java进程,core文件 或者远程 调试服务 的java线程栈信息,从而分析java程序性能不佳或者崩溃的问题.另外该命令是实验 ...

  4. jvm线程分析命令_JVM:如何分析线程转储

    jvm线程分析命令 本文将教您如何分析JVM线程转储,并查明问题的根本原因. 以我的观点,线程转储分析是掌握Java EE生产支持的任何个人最重要的技能. 您可以从线程转储快照中获取的信息量通常远远超 ...

  5. JVM:如何分析线程转储

    本文将教您如何分析JVM线程转储,并查明问题的根本原因. 从我的角度来看,线程转储分析是掌握Java EE生产支持的任何个人最重要的技能. 您可以从线程转储快照中获取的信息量通常远远超出您的想象. 我 ...

  6. jmc线程转储_如何分析线程转储– IBM VM

    jmc线程转储 本文是我们的线程转储分析系列的第4部分,它将为您提供什么是IBM VM的JVM线程转储以及您将找到的不同线程和数据点的概述. 您将看到和学习​​到,IBM VM Thread Dump ...

  7. 如何分析线程转储– IBM VM

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

  8. java堆栈_java线程的堆栈跟踪之jstack篇

    该命令打印java线程的堆栈跟踪,可以得知哪些线程被阻塞或正等待,以便于查找如线程死锁的原因 用法: jstack [ option ] pid jstack [ option ] executabl ...

  9. 【深入理解java虚拟机v3 】 4.2.6 jstack:Java堆栈跟踪工具(查看所有的线程信息占cpu最高的进程和线程)

    文章目录 1. 原文概述 补充概述 2. 例子 2.1 用jstack加进程id查找死锁 2.2 jstack统计线程数 2.3 jstack检测cpu高 3. 实战 3.1 一次cpu高的实战记录 ...

最新文章

  1. 【modbus】libmodbus库的移植与使用
  2. 关卡设计快速入门_7. 自己来!
  3. Kuangyeye and hamburgers
  4. php下划虚线,什么是下划线符号
  5. 防火墙软件测试工资,防火墙的性能测试
  6. opencv 腐蚀 matlab,Opencv3编程入门笔记(4)腐蚀、膨胀、开闭运算、漫水填充、金字塔、阈值化、霍夫变换...
  7. [转]c++类的构造函数详解
  8. Winodws Socket I/O模型的整理
  9. unchecked异常_为什么要在Java中使用Unchecked异常而不是Checked异常
  10. (教学思路 C#之类五)类的分类(静态类、实例类、嵌套类、结构、简单的抽象类、简单的密封类)...
  11. java怎么写事件listener_java 事件监听器ActionListener
  12. 计算机硬件实验教程pdf,计算机硬件技术基础实验教程答案(重庆大学)
  13. mysql存放lng lat_使用空间点类型在MySQL中存储Lat Lng值
  14. 计算机专业基础 -- C++相关与MFC基础知识
  15. Bootstrap FileInput.js + springmvc uploadFile
  16. 【MAC技巧】 MAC下两款免费的风扇调节工具
  17. three.js 05-04 之 BoxGeometry 几何体
  18. 11、C++各大有名库的介绍——综合
  19. 笔记本电脑秒便WIFI热点
  20. 【复盘】互联网老辛七月复盘-年中flag

热门文章

  1. 小程序真机测试错误代码_测试不充分:知道您的代码是否真的可以投入生产的5种方法...
  2. apache ignite_Kubernetes集群上的Apache Ignite和Spring第1部分:Spring Boot应用程序
  3. exchanger_如何通过示例在Java中使用Exchanger
  4. openj9下载_Quarkus on OpenJ9 JVM和资源消耗
  5. jdk 1.8 内存可见性_JDK 14中的常规,安全和确定性外部内存访问
  6. java uuid_Java UUID
  7. red hat安装宝塔_只需几分钟即可安装Red Hat Container Development Kit(视频)
  8. @namedqueries_在@NamedQueries中枚举@NamedQuery
  9. spring和spring_Spring WebApplicationInitializer和ApplicationContextInitializer的混淆
  10. OCA第2部分中的Java难题