JVM:如何分析线程转储

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

我的目标是与您分享我在过去10年中积累的有关线程转储分析的知识,例如数百个线程转储分析周期以及许多JVM版本和JVM供应商之间的数十种常见问题模式。

请为此页面添加书签,并随时关注每周的文章。
也请随时与您的工作同事和朋友分享此Thread Dump培训计划。

听起来不错,我真的需要提高我的Thread Dump技能……那么我们从哪里开始呢?

我向您提出的是一个完整的“线程转储”培训计划。 将涵盖以下项目。 我还将为您提供现实的线程转储示例,您可以学习和理解。

1)线程转储概述和基础知识
2)线程转储生成技术和可用工具
3)Sun HotSpot,IBM JRE和Oracle JRockit之间的线程转储格式差异 4)线程堆栈跟踪的解释和解释 5)线程转储分析和相关技术 6)线程转储常见问题模式(线程争用,死锁,挂起IO调用,垃圾回收/ OutOfMemoryError问题,无限循环等) 7)通过实际案例研究得出的线程转储示例

我真的希望这个线程转储分析培训计划对您有所帮助,所以请继续关注每周更新和文章!

但是,如果我仍然有疑问或仍在努力理解这些培训文章怎么办?

不用担心,请考虑我为您的培训师。 我强烈建议您向我提问关于Thread Dump的任何问题请记住,没有愚蠢的问题 ),因此,我免费为您提供以下选择; 只需选择您更熟悉的通信模型即可:

1)通过在文章下方发布您的评论来提交与主题转储相关的问题( 请随时保持匿名
2)将线程转储数据提交到根本原因分析论坛
3)给我发电子邮件与您的主题转储相关的问题@ phcharbonneau@hotmail.com

我可以从生产环境/服务器向您发送线程转储数据吗?

是的,如果您希望讨论问题的根本原因,请随时通过电子邮件或“ 根本原因分析”论坛将您生成的线程转储数据发送给我。 现实生活中的线程转储分析始终是最好的学习方法。

我真的希望您会喜欢并分享此线程转储分析培训计划。 我将尽力为您提供优质的材料和任何问题的答案。

在深入研究线程转储分析和问题模式之前,了解基础知识非常重要。 该文章将介绍基础知识,并让您更好地与Java EE容器进行JVM和中间件交互。

Java VM概述

Java虚拟机实际上是任何Java EE平台的基础。 这是您的中间件和应用程序已部署并处于活动状态的地方。

JVM为中间件软件和Java / Java EE程序提供以下功能:

– Java / Java EE程序的运行时环境(字节码格式)
–几个程序功能和实用程序(IO设施,数据结构,线程管理,安全性,监视等)
–通过垃圾回收器动态分配和管理内存

您的JVM可以驻留在许多操作系统(Solaris,AIX,Windows等)上,并且根据您的物理服务器规格,您可以为每个物理/虚拟服务器安装1…n个JVM进程。

JVM和中间件软件交互

在下面找到一个图,该图向您显示JVM,中间件和应用程序之间的高级交互视图。

这向您展示了JVM,中间件和应用程序之间的典型且简单的交互图。 如您所见,标准Java EE应用程序的线程分配主要在中间件内核本身和JVM之间完成( 当应用程序本身或某些API直接创建线程时会有一些例外,但这并不常见,必须非常小心地完成 ) 。

另外,请注意,某些线程是在JVM自身内部进行管理的,例如GC(垃圾收集)线程,以便处理并发垃圾收集。

由于大多数线程分配是由Java EE容器完成的,因此了解并识别线程堆栈跟踪并从线程转储数据中正确识别它很重要,这一点很重要。 这将使您快速了解Java EE容器尝试执行的请求的类型。

从线程转储分析的角度,您将学习如何区分从JVM找到的不同线程池并确定请求类型。

最后一部分将为您概述什么是HotSpot VM的JVM线程转储以及您将找到的不同线程。 第4部分将提供IBM VM线程转储格式的详细信息。

请注意,您可以从根本原因分析论坛中找到本文使用的线程转储示例。

JVM线程转储–这是什么?

JVM线程转储是在给定时间拍摄的快照,可为您提供所有已创建的Java线程的完整列表。

找到的每个单独的Java线程都会为您提供以下信息:

线程名称 ; 通常由中间件供应商用于标识线程ID及其关联的线程池名称和状态(运行,阻塞等)。

线程类型和优先级,例如: 守护程序prio = 3 **中间件软件通常将其线程创建为守护程序,这意味着它们的线程在后台运行; 向用户提供服务,例如您的Java EE应用程序**

Java线程ID,例如: tid = 0x000000011e52a800 **这是通过java.lang.Thread.getId()获得的Java线程ID,通常以自动递增long 1..n **的形式实现

–本机线程ID,例如: nid = 0x251c **作为本机线程ID的重要信息,您可以关联例如从OS角度来看哪个线程在JVM中使用最多的CPU等。

Java线程状态和详细信息,例如: 等待监视器条目[0xfffffffea5afb000] java.lang.Thread.State:已阻止(在对象监视器上)
**允许快速了解线程状态及其潜在的电流阻塞条件**

Java线程堆栈跟踪 ; 这是迄今为止从线程转储中找到的最重要的数据。 这也是您将花费大部分时间的地方,因为Java Stack Trace为您提供了90%的信息,以便查明许多问题模式类型的根本原因,您将在稍后的培训课程中学习

Java堆故障 ; 从HotSpot VM 1.6开始,您还将在“线程转储”快照的底部找到HotSpot内存空间利用率的细目分类,例如Java堆(YoungGen,OldGen)和PermGen空间。 当怀疑过多的GC是可能的根本原因时,此功能非常有用,因此您可以对找到的线程数据/模式进行开箱即用的关联

Heap
PSYoungGen      total 466944K, used 178734K [0xffffffff45c00000, 0xffffffff70800000, 0xffffffff70800000)
eden space 233472K, 76% used [0xffffffff45c00000,0xffffffff50ab7c50,0xffffffff54000000)
from space 233472K, 0% used [0xffffffff62400000,0xffffffff62400000,0xffffffff70800000)
to   space 233472K, 0% used [0xffffffff54000000,0xffffffff54000000,0xffffffff62400000)
PSOldGen        total 1400832K, used 1400831K [0xfffffffef0400000, 0xffffffff45c00000, 0xffffffff45c00000)
object space 1400832K, 99% used [0xfffffffef0400000,0xffffffff45bfffb8,0xffffffff45c00000)
PSPermGen       total 262144K, used 248475K [0xfffffffed0400000, 0xfffffffee0400000, 0xfffffffef0400000)
object space 262144K, 94% used [0xfffffffed0400000,0xfffffffedf6a6f08,0xfffffffee0400000)

线程转储故障概览

为了使您更好地理解,请在下面的图表中直观地查看HotSpot VM线程转储及其常见的线程池:

您可以从HotSpot VM线程转储中找到一些信息。 根据您的问题模式,其中一些功能比其他功能更重要(问题模式将在以后的文章中进行模拟和解释)。

现在,根据我们的示例 HotSpot线程转储,在下面找到每个线程转储部分的详细说明:

#全线程转储标识符
基本上,这是唯一的关键字,一旦生成线程转储(例如:对于UNIX,通过kill -3 <PID>),您就会在中间件/标准Java输出日志中找到该关键字。 这是“线程转储”快照数据的开始。

Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.0-b11 mixed mode):

#Java EE中间件,第三方和自定义应用程序线程
这部分是线程转储的核心,通常您将在其中花费大部分分析时间。 找到的线程数将取决于您使用的中间件软件,第三方库(可能具有其自己的线程)和您的应用程序( 如果创建任何自定义线程,通常不是最佳实践 )。

在我们的示例线程转储中,Weblogic是所使用的中间件。 从Weblogic 9.2开始,使用具有唯一标识符“'weblogic.kernel.Default(自我调整)”的自我调整线程池。

"[STANDBY] ExecuteThread: '414' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=3 tid=0x000000010916a800 nid=0x2613 in Object.wait() [0xfffffffe9edff000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0xffffffff27d44de0> (a weblogic.work.ExecuteThread)at java.lang.Object.wait(Object.java:485)at weblogic.work.ExecuteThread.waitForRequest(ExecuteThread.java:160)- locked <0xffffffff27d44de0> (a weblogic.work.ExecuteThread)at weblogic.work.ExecuteThread.run(ExecuteThread.java:181)

#HotSpot VM线程
这是由HotSpot VM管理的内部线程,以执行内部本机操作。 通常,除非看到较高的CPU(通过线程转储和prstat /本机线程ID相关性),否则您不必担心这一点。

"VM Periodic Task Thread" prio=3 tid=0x0000000101238800 nid=0x19 waiting on condition

#HotSpot GC线程
当使用HotSpot并行GC时(在使用多物理核心硬件时,这很普遍),默认情况下或根据JVM调整一定数量的GC线程,HotSpot VM会创建。 这些GC线程允许VM以并行方式执行其定期GC清理,从而总体上减少了GC时间。 以增加CPU利用率为代价。

"GC task thread#0 (ParallelGC)" prio=3 tid=0x0000000100120000 nid=0x3 runnable
"GC task thread#1 (ParallelGC)" prio=3 tid=0x0000000100131000 nid=0x4 runnable
………………………………………………………………………………………………………………………………………………………………

这也是至关重要的数据,因为当面临与GC相关的问题(例如过多的GC,内存泄漏等)时,您将能够使用其本机id值(nid)将从OS / Java进程观察到的任何高CPU与这些线程相关联= 0x3)。 您将在以后的文章中学习如何识别和确认此问题。

#JNI全局引用计数
JNI(Java本机接口)全局引用基本上是从本机代码到Java垃圾收集器管理的Java对象的对象引用。 其作用是防止收集本机代码仍在使用但技术上在Java代码中没有“实时”引用的对象。

监视JNI引用以检测与JNI相关的泄漏也很重要。 如果您直接使用JNI进行编程,或者使用易于发生本机内存泄漏的第三方工具(例如监视工具)进行编程,则可能会发生这种情况。

JNI global references: 1925

#Java堆利用率视图
此数据已添加回JDK 1 .6,并为您提供了HotSpot Heap的简短快速视图。 我发现在与GC相关的问题以及HIGH CPU一起进行故障排除时,它非常有用,因为您可以在单个快照中同时获得线程转储和Java堆,从而可以确定(或排除)特定Java堆内存空间中的任何压力点以及当前当时正在执行线程计算。 正如您在示例线程转储中所看到的,Java堆OldGen已被最大化!

HeapPSYoungGen      total 466944K, used 178734K [0xffffffff45c00000, 0xffffffff70800000, 0xffffffff70800000)eden space 233472K, 76% used [0xffffffff45c00000,0xffffffff50ab7c50,0xffffffff54000000)from space 233472K, 0% used [0xffffffff62400000,0xffffffff62400000,0xffffffff70800000)to   space 233472K, 0% used [0xffffffff54000000,0xffffffff54000000,0xffffffff62400000)PSOldGen        total 1400832K, used 1400831K [0xfffffffef0400000, 0xffffffff45c00000, 0xffffffff45c00000)object space 1400832K, 99% used [0xfffffffef0400000,0xffffffff45bfffb8,0xffffffff45c00000)PSPermGen       total 262144K, used 248475K [0xfffffffed0400000, 0xfffffffee0400000, 0xfffffffef0400000)object space 262144K, 94% used [0xfffffffed0400000,0xfffffffedf6a6f08,0xfffffffee0400000)

我希望本文有助于理解HotSpot VM线程转储的基本视图。下一篇文章将为您提供与IBM VM相同的线程转储概述和细分。

请随时发表任何评论或问题。

参考: 如何分析线程转储–第1部分 ,   如何分析线程转储–第2部分:JVM概述和 如何分析线程转储–第3部分: 来自JCG合作伙伴的 HotSpot VM   “ Java EE支持模式和Java教程”博客上的Pierre-Hugues Charbonneau。


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

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

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

相关文章

极光推送JPush的快速集成

首先到极光推送的官网上创建一个应用&#xff0c;填写对应的应用名和包名。 创建好之后下载Demo 提取Sdk里面的图片和xml等资源文件放自己项目的相应位置&#xff0c;然后要注意的是.so文件的放置位置&#xff1a; 在main目录下新建一个jniLibs文件夹&#xff0c;放在这个文件夹…

c遗传算法的终止条件一般_Matlab2 :Matlab遗传算法(GA)优4~-r-具箱是基于基本操作 联合开发网 - pudn.com...

Matlab2所属分类&#xff1a;matlab例程开发工具&#xff1a;PDF文件大小&#xff1a;115KB下载次数&#xff1a;76上传日期&#xff1a;2007-09-07 20:04:29上 传 者&#xff1a;钱广说明&#xff1a; &#xff1a;Matlab遗传算法(GA)优4~-r-具箱是基于基本操作及终止条件、二…

用程序输出表格

做应用程序的时候经常需要输出excel表格&#xff0c;除了不同语言接口完善程度不同的麻烦以及要添加各种外部引用的麻烦之外还要考虑应用环境不同的office版本的问题&#xff0c;实在麻烦 当只需要输出数据&#xff0c;不管颜色什么的的话&#xff0c;有个避免上述麻烦的办法就…

elk系列1之入门安装与基本操作

preface 我们每天都要查看服务器的日志&#xff0c;一方面是为了开发的同事翻找日志&#xff0c;另一方面是巡检服务器查看日志&#xff0c;而随着服务器数量以及越来越多的业务上线&#xff0c;日志越来越多&#xff0c;人肉运维相当痛苦了&#xff0c;此时&#xff0c;参考现…

Java 7 –反编译项目硬币

大家好&#xff0c;该是从2012年开始写作的时候了。正如您在其他博客中可能已经看到的那样&#xff0c;有一些更改可以使您使用Java编程时的开发人员生活变得更加轻松&#xff1a;Diamond运算符&#xff0c;Switchs中的Strings&#xff0c;尝试使用资源&#xff0c;多次捕获等 …

git安装后找不见版本_无法安装最新版本的Gitlab

这个问题不是代码,而是Gitlab的安装.我现在试图安装Gitlab几天没有成功.实际上,很久以前,他们提出了使用wget的方法非常好,但由于我们必须使用Curl的方法,所以不可能比下载更进一步.在Ubuntu 14.04机器上,以下命令有效&#xff1a;curl https://packages.gitlab.com/install/re…

在Excel表里面插入背景图

工作中我们会经常用到MS Excel&#xff0c;通常我们打开MS Excel&#xff0c;里面的工作表都是空白单调的背景。当然了&#xff0c;MS Excel可以在工作簿里面插入背景图片。那么问题来了&#xff0c;如果你没有安装Microsoft Office&#xff0c;该如何在Excel文件里面插入好看的…

Java 7:复制和移动文件和目录

这篇文章是我关于Java 7 java.nio.file软件包的系列文章的继续&#xff0c;这次涵盖了文件的复制和移动以及完整的目录树。 如果您曾经对Java缺少copy和move方法感到沮丧&#xff0c;那么请继续阅读&#xff0c;以免麻烦。 涵盖范围中包括非常有用的Files.walkFileTree方法。 但…

java 五子棋项目_Java项目如何实现五子棋小游戏

Java项目如何实现五子棋小游戏发布时间&#xff1a;2020-07-21 14:53:06来源&#xff1a;亿速云阅读&#xff1a;77作者&#xff1a;小猪小编这次要给大家分享的是Java项目如何实现五子棋小游戏&#xff0c;文章内容丰富&#xff0c;感兴趣的小伙伴可以来了解一下&#xff0c;希…

Java中多线程的使用!!

简介&#xff1a; 1.要了解多线程&#xff0c;首先我们得先了解进程和线程。那么什么是进程&#xff1f;进程就是一个正在运行的程序分配内存让应用程序能够运行的叫做进程。那么什么又是线程呢&#xff1f;线程&#xff1a;在一个程序中&#xff0c;负责代码的执行&#xff0c…

java pkcs1转pkcs8_pkcs1与pkcs8格式RSA私钥互相转换

1、PKCS1私钥生成openssl genrsa -out private.key 1024private.key文件内容如下&#xff1a;-----BEGIN RSA PRIVATE KEY-----MIICXQIBAAKBgQDREk3uy4x9i4a16OYOYEp5Ir2f16lsmUHB2HjGDlxkU0ju9YApyeZlUXb191ZkxJ2vx2vKppN4gKLDy5r7JMTpwch1CNvceySX6DiM4lwTAnUEZiBYgNBNrKINEt…

嵌入式码头,Vaadin和焊接

当我开发Web应用程序时&#xff0c;我希望能够从Eclipse快速启动它们&#xff0c;而不必依赖各种重量级的tomcat或glassfish插件。 因此&#xff0c;我通常要做的只是创建一个可以直接从Eclipse运行的基于Java的简单启动器。 该启动器会在几秒钟内启动&#xff0c;因此使开发工…

创建真机调试证书(苹果开发者平台各个选项对应的含义)

创建真机调试证书&#xff08;苹果开发者平台各个选项对应的含义&#xff09; 原文地址&#xff1a;http://jingyan.baidu.com/article/ff411625b8141312e48237a7.html转载于:https://www.cnblogs.com/siasyl/p/5340593.html

gl.vertexAtteib3f P42 讲数据传给location参数指定的attribute变量

参数  location  指定将要修改的attribute变量存储位置 v0  指定填充attribute变量第一个分量的值 v1  指定填充attribute变量第二个分量的值 v2  指定填充attribute变量第三个分量的值 var VSHADER_SOURCE attribute vec4 a_Position;\n void main(){\n gl_Posit…

将Spring集成到旧版应用程序中

所有Spring开发人员喜欢做的事情之一就是将Spring塞入他们正在工作的任何应用程序中–这是我生活中的罪恶感之一&#xff1a;您看到一些代码&#xff0c;认为它是垃圾&#xff0c;因为它包含几个众所周知的反模式&#xff0c;然后想想如果这个应用程序是Spring应用程序会多么酷…

java自己实现ioc_springioc原理、springmvc项目分析、自己实现IOC

从一个面试题开始&#xff1a;你自己实现IOC容器的话&#xff0c;保存bean你会使用什么数据结构来保存呢&#xff1f;现在的很多开发人员(甚至3年以上的)不一定能回答这问题&#xff0c;为什么会这样呢&#xff1f;这个跟现在springboot现在已经高度成熟了&#xff0c;很多配置…

实现两级下拉框的联动

1.实现两级下拉框的联动。 功能&#xff1a;实现点击年级下拉框&#xff0c;加载对应科目的下拉框。 第一步&#xff1a;首先要加载年级下拉框中的数据。 01.在GradeDAL层&#xff08;数据访问层&#xff09;写一个方法&#xff0c;查询所有年级的信息。 /// <summary>//…

System.nanoTime()背后是什么?

在Java世界中&#xff0c;对System.nanoTime&#xff08;&#xff09;的理解非常好。 总有一些人说它是快速&#xff0c;可靠的&#xff0c;并且在可能的情况下&#xff0c;应该使用它代替System.currentTimemillis&#xff08;&#xff09;进行计时。 总的来说&#xff0c;他绝…

python连接SQL Server取多个结果集:Pymssql模块

基本的用法可以参考&#xff1a;python连接SQL Server&#xff1a;Pymssql模块 和上一篇文章中的代码&#xff0c;只取一个结果集不同&#xff0c;这次会一次运行2个sql语句&#xff0c;然后分别取出2个结果集&#xff0c;打印输出。 代码中有详细的注释&#xff0c;一看就明白…

状态不属于代码

Web应用程序中的“状态”是什么&#xff1f; 它就是要存储的数据&#xff08;无论目的地是什么—内存&#xff0c;数据库&#xff0c;文件系统&#xff09;。 应用程序本身不得在代码中存储任何状态。 这意味着您的类应仅包含带有无状态对象的字段。 换句话说&#xff0c;在程序…