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

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,通常实现为长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 Heap 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

jvm线程分析命令

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

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

相关文章

[na]华为acl(traffic-filter)和dhcp管理

这个是财务网络的一个问题, 要求财务的某台机器能访问其他部门区的打印机. 其他部门是不能访问到财务网络的. 华为alc配置实例:-traffic-filter # 在VLAN100上配置基于ACL的报文过滤&#xff0c;允许源IP地址为192.168.0.2/32的报文通过&#xff0c;丢弃其他报文。 <HUAWEI&…

svn 1.6 linux 下载,LINUX下Subversion1.6.17 部署

1、服务器版本和安装软件服务器版本&#xff1a;Redhat Enterprise 5.5 32bit安装软件&#xff1a;apr-1.3.12.tar.gzapr-util-1.3.12.tar.gzhttpd-2.2.9.tar.gzsqlite-amalgamation-3.7.3.tarsubversion-1.6.17.tar.bz2subversion-deps-1.6.17.tar.bz22、安装检查操作系统http…

JBoss Fuse –使用MVEL将您的静态配置转换为动态模板

最近&#xff0c;我重新发现了我遗忘的JBoss Fuse功能&#xff0c;并且我认为其他人可能会从此提醒中受益 。 这篇文章将重点放在JBoss Fuse和Fabric8上&#xff0c;但所有正在寻找最小侵入性方法来为其静态配置文件添加一定程度的动态支持的开发人员也可能会对此感兴趣。 在…

在linux中dns不安装coching,ubuntu 8.04下openldap的安装和使用

ubuntu 8.04上openldap的安装和使用1、安装openldap。$ sudo apt-get install slapd ldap-utils2、配置openldap。$ sudo /etc/ldap/slapd.conf需要修改的有以下4处。# The base of your directory in database #1# 域名前缀suffix "dcpeercoaching,dccn"# …

linux 拿shell,linux下备份拿shell[渗透必备]

关于php包含Apache日志的利用,其实也就是利用提交的网址里有php语句&#xff0c;然后再被Apache服务器的日志记录&#xff0c;然后php再去包含执行&#xff0c;从而包含了去执行。当然&#xff0c;这种办法最大的弊端是Apache日志肯定会过大&#xff0c;回应的时候当然会超时什…

信息系统开发内容

1.按照用于质量管理的能力成熟度模型&#xff08;CMM&#xff09;描述系统开发过程的动机。 2.区分系统生命周期和系统开发方法 3.描述系统开发的10个基本原理 4.定义问题、机会和指示——系统开发项目的能力 5.描述用于把问题、机会和指示进行分类的PIECES框架 6.描述系统开发…

jee neow_JEE7:展望新时代

jee neow计划于2012年下半年发布的Java EE 7预计的JSR都已启动并正在运行。 Java EE 7发行版是日期驱动的&#xff0c;它将反映该行业迁移到云中时不断变化的需求&#xff1a;任何未准备就绪的内容将推迟到Java EE 8中使用 。 这是Java EE 7平台中不同规范的关键功能的更新和摘…

Linux怎么更改声音板卡顺序,51CTO博客-专业IT技术博客创作平台-技术成就梦想

SUN M8000主机 IOU板卡硬件更换一、故障现象1.日志分析XSCF> showstatus*IOU#0 Status:Degraded;XSCF> showlogs -v errorDate: May 24 20:44:22 CST 2019 Code: 80002000-33010000-0167058a00000000Status: Alarm Occurred: May 24 20:44:20.367 C…

Class.getResource和ClassLoader.getResource的区别分析

原文&#xff1a;http://swiftlet.net/archives/868 在Java中获取资源的时候&#xff0c;经常用到Class.getResource和ClassLoader.getResource&#xff0c;本文给大家说一下这两者方法在获取资源文件的路径差异。Class.getResource(String path)path不以/开头时&#xff0c;默…

设计模式的Java 8 Lambda表达式–命令设计模式

在本博客中&#xff0c;我将说明如何使用Java 8 Lambda表达式以函数式编程方式实现命令模式 。 命令模式的目的是将请求封装为对象&#xff0c;从而为具有不同请求&#xff0c;队列或日志请求的客户端参数化&#xff0c;并支持相应的操作。 命令模式是一种编写通用代码的方法&a…

凝思linux系统显卡设置,TaiShan服务器安装凝思操作系统Linx6.0.90并设置独立显卡WX2100输出...

TaiShan服务器安装凝思操作系统Linx6.0.90并设置独立显卡WX2100输出环境准备&#xff1a;TaiShan 2280服务器&#xff0c;凝思操作系统Linx6.0.90 arm64&#xff0c;WX2100显卡&#xff0c;WX2100显卡固件和驱动安装包第1步&#xff0c;上电服务器&#xff0c;登录BMC输入用户名…

JMeter3.0_插件管理

JMeter Plugins 一直以来&#xff0c;JMeter Plugins为我们提供了很多高价值的JMeter插件&#xff0c;比如: 用于服务器性能监视的PerfMon Metrics Collector用于建立压力变化模型的Stepping Thread Group用于Json解析的JSON Path Extractor用于展示响应时间曲线的Response Tim…

linux update语句,关于Update语句的调整(5-1)

调整方法二&#xff1a;建立临时表&#xff0b;Merge(&#xff11;)1.调整方法二&#xff1a;建立临时表&#xff0b;Merge通过建立临时表保存中间结果并结合merge语句的方法对语句进行调整。背景知识简介l临时表简介数据库中的所有会话均可以访问临时表&#xff0c;但只有插入…

JavaWeb总结(四)

使用Servlet发送服务器端响应信息 Servlet API中定义一个专门的接口类javax.servlet.http.HttpServletResponse用于创建HTTP响应&#xff0c;包括HTTP协议的状态行、响应头以及消息体&#xff1b; HTTP响应示例 设置响应状态行 - 状态行分为HTTP协议、状态码和状态描述三个部分…

java ee开发环境_设置Java EE 6开发环境

java ee开发环境本教程简要说明了如何设置典型的环境来开发基于Java EE 6的应用程序。 除了可以正常工作的Windows XP客户端具有足够的CPU能力和内存外&#xff0c;本教程没有其他先决条件。 在教程中&#xff0c;我们将需要安装以下组件&#xff1a; Java 6 JDK更新26 适用于…

学生成绩管理系统简单c语言源代码,c语言学生成绩管理系统源代码

好用#include#include#includetypedef struct stu{char sz_Name[20]; char sz_ID[11]; char sz_Class[10]; float r_Score[3];}student;#define STU_MAXSIZE 60int i_stuSize;student stu[STU_MAXSIZE];/*显示主菜单*/void Dis_Main_Menu(){printf("\n 学生成绩管理系统 \…

JavaWeb前端:HTML5 简介

简单了解HTML5知识转载于:https://www.cnblogs.com/vivian-test/p/5949773.html

c语言程序运行结果怎么看,帮忙看看我这个C语言程序有什么错误,运行结果不正确...

C语言的最大特点是&#xff1a;功能强、使用方便灵活。C编译的程序对语法检查并不象其它高级语言那么严格&#xff0c;这就给编程人员留下“灵活的余地”&#xff0c;但还是由于这个灵活给程序的调试带来了许多不便&#xff0c;尤其对初学C语言的人来说&#xff0c;经常会出一些…

JSF 2.2在30秒内创建一个自定义Hello World组件

让我们直接跳到很酷的东西上&#xff0c;说在JSF 2.0中&#xff0c;通过在Facelet标记库&#xff08; *taglib.xml &#xff09;中对其进行配置&#xff0c;使页面作者可以使用自定义组件。 此外&#xff0c;当将组件映射到JAR中时&#xff0c;需要在web.xml一个特殊条目以指向…

[ACM训练] ACM中巧用文件的输入输出来改写acm程序的输入输出 + ACM中八大输入输出格式...

ACM中巧用文件的输入输出来改写acm程序的输入输出 经常有见大神们使用文件来代替ACM程序中的IO&#xff0c;尤其是当程序IO比较复杂时&#xff0c;可以使自己能够更专注于代码的测试&#xff0c;而不是怎样敲输入。 C/C代码中&#xff1a; 使用 stdio.h 中包含的另一个函…