如何分析线程转储–线程堆栈跟踪

本文是“ 线程转储”分析系列的第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过多。
thread_stack_trace_sample

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

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

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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式学习笔记(十三:原型模式)

1.1概述 用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。这就是原型模式的定义。 在某些情况下,可能不希望反复使用类的构造方法创建许多对象,而是希望使用该类创建一个对象后,以该对象为原型得到该对象的若干个…

翻译的一篇关于学习编程语言的小文章

Top programming languages to get a job in Toronto in 2017 在程序开发人员和软件工程师中最容易被提及的问题之一就是:“我要学的下一门编程语言该是谁?” 我想去选一个编程语言,我希望你能给我一些关于经常使用到的编程语言的建议&#x…

从linux内核启动,学习Linux内核启动过程:从start_kernel到init

一、实验步骤:1:运行menuos:a)cd LinuxKernel/b)qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img启动后启动了MenuOS。2:使用gdb调试跟踪menuos内核启动和运行过程;a)qemu -kernel linux-3.18.6/arch/x86/bo…

linux强制回收内存,Linu系统cache强制回收

LINUX的内存管理机制,一般情况下不需要特意去释放已经使用的cache。Cache机制的存在,使得Linux对磁盘的读写速度是有较大的好处的。 在 Linux 操作系统中,当应用程序需要读取文件中的数据时,操作系统先分配一些内存,将…

Google API:如何访问Google Analytics(分析)数据?

在深入研究Google Analytics(分析)API之前,了解一些Google Analytics(分析)术语及其关系总是很有用的。 Google帐户:要访问Google Analytics(分析),用户将需要一个Google…

设计模式学习笔记(十六:桥接模式)

1.1概述 将抽象部分与它的实现部分分离,使他们都可以独立地变化。这就是桥接模式的定义。 抽象类或接口中可以定义若干个抽象方法,习惯上将抽象方法称作操作。抽象类或接口使程序的设计者忽略操作的细节,即不必考虑这些操作是如何实现的&…

linux静默删除文件夹,Linux常用命令10 - unzip

zip 是最广泛使用的归档文件, 除了linux,windows也是非常的广泛。,支持无损数据压缩。 zip 文件是包含一个或多个压缩文件或目录的数据容器。接下来,我将解释如何使用 unzip 命令通过命令行解压缩 Linux 系统中的文件。 还有与之对应就是 zip…

python基础:迭代器、生成器(yield)详细解读

1. 迭代器 迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。 1.1 使用迭代器的优点 对于原生支持随机访问的数据…

Linux将硬盘转化为pv,Linux扩展硬盘 物理卷(PV) 卷组(VG) 逻辑卷(LV)

1、给虚拟机添加两块新的sata虚拟硬盘,容量8G和10G# fdisk -l 命令2、分别在这两个硬盘上建立pvPvcreate /dev/sdb 创建一个物理卷/dev/sdb 磁盘名是 fdisk -l 查询出来的Pvscan 查看当前所有物理卷Pvdisplay 查看当前所有物理卷的详情3、创建VG,使得…

ubuntu 16.10 shu rufa meiy ou l e geng xi zhi hou

转载于:https://www.cnblogs.com/ganmk--jy/p/6035894.html

红旗linux 进不去图形界面,进不了红旗Linux6.0的图形界面请高手帮忙

习生 于 2008-11-02 11:08:42发表:引用:原帖由 zhaoruiqi 于 2008-11-2 10:03 发表 我的也是进不了图形界面,用文本安装后进系统也一样正常按rtl的方法对xorg.conf进行修改,已经能进入图形界面。你看看楼上rtl的回复的能否对你有帮助。zhaoruiqi 于 2008-11-02 10:0…

基于Activiti工作流引擎实现的请假审核流程

概要 本文档介绍的是某商用中集成的Activiti工作流的部署及使用,该框架用的Activiti版本为5.19.0。本文档中主要以一个请假流程为例子进行说明,该例子的流程图如下: 这是一个可以正常运作的工作流业务了,但是它也有不足的地方&…

linux编译ffmpeg成so,「ffmpeg」一 mac 环境下编译ffmpeg,生成so库文件

1.下载ffmpeg源码,官网,我这里直接采用git 方式下载:下载ffmpeg.png终端输入git命令:静静等待~最后下载的版本为3.4.6 。image.png这里注意一下,刚开始我用的ndk版本是ndk-17b,在编译该版本的ffmpeg时始终失败&#xf…

Spring Security 3 Ajax登录–访问受保护的资源

我看过一些有关Spring Security 3 Ajax登录的博客,但是我找不到解决如何调用基于Ajax的登录的博客,匿名用户正在Ajax中访问受保护的资源。 问题 – Web应用程序允许匿名访问某些部分,并且某些部分是受保护的资源,需要用户登录。 …

linux运维选择题,初学Linux练习题

1、将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中tr ‘a-z’ ‘A-Z’ < /etc/issue > /tmp/issue.out2、将当前系统登录用户的信息转换为大写后保存至/tmp/who.out文件中3、一个linux用户给root发邮件&#xff0c;要求邮件标题为”help”&#xff0c…

[转]Web Api系列教程第2季(OData篇)(二)——使用Web Api创建只读的OData服务

本文转自&#xff1a;http://www.cnblogs.com/fzrain/p/3923727.html 前言 很久没更新了&#xff0c;之前有很多事情&#xff0c;所以拖了很久&#xff0c;非常抱歉。好了&#xff0c;废话不多说&#xff0c;下面开始正题。本篇仍然使用上一季的的项目背景&#xff08;系列地址…

linux idea 快捷键,Linux 下 IDEA 的 Ctrl+Alt+S

前言这是个困扰我一年多的问题&#xff0c;今天终于解决了……起因一年前将主系统换成 Arch Linux 后&#xff0c;其他一切正常就是 IDEA 的打开设置的快捷键 ctrlalts 失效&#xff0c;让我很是头疼。虽然不是很重要&#xff0c;但是对于我这种强迫症来说别提多难受了……我曾…

C语言数字3转变字符 3 程序,大学c语言知识点总结

大学c语言知识点总结C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。一起来看看大学c语言知识点总结吧!大学c语言知识点总结1、编译预处理不是C语言的一部分&#xff0c;不再运行时间。C语言编…

接触Jenkins(Hudson)API,第1部分

哪一个-哈德森还是詹金斯&#xff1f; 都。 几个月前&#xff0c;我开始使用Hudson v1.395来从事这个小项目&#xff0c;在出现巨大分歧之后又回到了这个项目。 我以此为契机&#xff0c;看我将来选择永久搬到詹金斯时是否会遇到任何重大问题。 有很多麻烦-最值得注意的是&…

使用javascript模拟常见数据结构(四)

七、树 树是一种非线性的分层的数据结构&#xff0c;在现实生活中比较常见的例子比如家谱和公司的组织架构图&#xff0c;如下所示&#xff1a; 一个树结构存在着一系列的父子结构&#xff0c;并且有着一个根节点&#xff0c;这种结构本质上表明了一对多的关系。 那&#xff0c…