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;放在这个文件夹…

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

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

Java 7 –反编译项目硬币

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

在Excel表里面插入背景图

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

实现两级下拉框的联动

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

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

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

Xen安全架构sHype/ACM策略配置图文教程

实验要求 1. 熟悉Xen虚拟化平台部署&#xff1b; 2. Xen sHype/ACM安全架构中的Simple TE和Chinese Wall策略及事实上现机制的分析与验证。 第1章 Xen环境部署 1.1 版本号选择 因为Ubuntu使用广泛。软件包易于下载。我们选择Ubuntu系统进行Xen部署…

java弹出虚拟键盘_JS实现电脑虚拟键盘的操作

本文实例为大家分享了JS实现电脑虚拟键盘的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下需求&#xff1a;1.当输入框光标聚焦时&#xff0c;电脑虚拟键盘弹出2.在输入框输入内容时&#xff0c;键盘跟着变化具体实现代码如下&#xff1a;Html部分&#xff1a;电脑键…

JBoss Drools –入门

这篇文章是关于我如何掌握JBoss Drools的 。 其背后的原因是&#xff1a;SAP收购了我公司当前的规则引擎&#xff0c;而Drools是我们将寻找的另一种选择&#xff0c;只要有人掌握了概念验证的技能即可。 尽管似乎有大量的文档&#xff0c;但是我总是会通过示例来发现它是有帮助…

android使用bintray发布aar到jcenter

前言 这两天心血来潮突然想把自己的android library的aar放到jcenter里面&#xff0c;这样一来自己便可以在任何时间任何地点通过internet得到自己的library的引用了&#xff0c;况且现在android studio已经默认使用jcenter的repositories作为依赖来源&#xff0c;以前的mavenc…

PHP 进程详解

PHP 进程详解PHP 进程详解 如下内容从《操作系统精髓与设计原理》中总结提炼得出&#xff0c;删除了大部分对于理解进程有干扰的文字&#xff0c;对进程知识结构进行的梳理。几乎所有内容为按照书本上摘抄下来的&#xff0c;我目前还总结提炼不出像作者这么深刻的见解。那么就先…

java都要caps标点_第 1 章 管理 Java CAPS 用户

第 1 章 管理 Java CAPS 用户在此处列出的主题提供了有关如何管理 Sun JavaTM Composite Application Platform Suite (Java CAPS) 中的用户的信息。如果您有任何问题&#xff0c;请参见 http://goldstar.stc.com/ 中的 Java CAPS Web 站点。管理系统信息库用户此类别包含以下用…

基于OpenCV 的美颜相机推送直播流

程序流程&#xff1a; 1.图像采集 先从opencv&#xff08;2.4.10版本&#xff09;采集回来摄像头的图像&#xff0c;是一帧一帧的 每一帧图像是一个矩阵&#xff0c;opencv中的mat 数据结构。 2.人脸的美化 人脸美化&#xff0c;我们用的皮肤检测&#xff0c;皮肤在颜色空间是特…

Spring线程池服务

线程池对于执行同步和异步过程非常重要。 本文介绍如何使用Spring开发和监视线程池服务。 创建线程池已通过两种替代方法进行了说明。 二手技术 &#xff1a; JDK 1.6.0_21 Spring3.0.5 Maven的3.0.2 步骤1&#xff1a;建立已完成的专案 创建一个Maven项目&#xff0c;如下…

我的世界java村民繁殖_我的世界:Java19w08a更新,村民加强守卫,小狐狸背叛

虽然这句话很绕口&#xff0c;其实意思很简单&#xff0c;那就是之前的隐身药水没有什么用&#xff0c;该被打还是被打。因为这个可是害惨了流浪商人&#xff0c;不过这次好了&#xff0c;流浪商人在喝了隐身药水之后就能安全度过晚上了。NO.3 皮革马铠马铠是属于马的盔甲&…

欧莱雅眉笔banner个人设计

眉笔名称&#xff1a;眉笔大师三头塑形眉笔 &#xff0c;之所以没用吧这个商品名称放大&#xff0c;是我觉得它是一个名称&#xff0c;而我把自己想的广告词“出彩只需一笔” 放大不仅能凸显出这只笔的强大&#xff0c;还表示了一种有了我这支眉笔你会更出彩更漂亮&#xff0c…

使用带有注释和JQuery的Spring MVC 3的Ajax

与Ajax一起工作对我来说一直很有趣&#xff01; 是不是 &#xff1f; 我将使您轻松将Ajax与Spring MVC 3和JQuery结合使用。 这篇文章将向您说明如何在工业编码的现实生活中使用Ajax。 和往常一样&#xff0c;我们将在Spring MVC 3框架中以Ajax的实际示例为例&#xff0c;并将其…

java百度云文件上传_关于如何在自己项目集成百度云BCE文件上传STS方案

1、 项目背景由于本人项目需要&#xff0c;需要在视频点播服务之中需要加载字幕文件(通用格式srt)&#xff0c;经过比较好几家的公有云服务&#xff0c;最后选择只有百度云提供字幕服务。字幕&#xff1a;我们通常在观看外语电影的是&#xff0c;没有国语版时候只能通过下载字幕…

hdu 3507 Print Article(斜率优化DP)

题目链接&#xff1a;hdu 3507 Print Article 题意&#xff1a; 每个字有一个值&#xff0c;现在让你分成k段打印&#xff0c;每段打印需要消耗的值用那个公式计算&#xff0c;现在让你求最小值 题解&#xff1a; 设dp[i]表示前i个字符需要消耗的最小值&#xff0c;那么有dp[i]…

第三章 consul服务注册与服务查询

1、定义一个服务 https://www.consul.io/docs/agent/services.html 该方法是服务注册中提供服务的最常用的方法。 关于服务的定义&#xff1a;服务的属性我们会在后边每出现一个总结一个&#xff0c;最后再做总结。 2、服务注册 2.1、创建服务文件所存放的文件夹 说明&#xff…