百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Java ThreadDump 生成解析 java thread run

mhr18 2024-12-30 05:28 27 浏览 0 评论

当有我们的服务器CPU资源使用率(usr%)较高时,或者是一个基于 JAVA 的 Web 应用运行的比预期慢的时候,我们需要使用 Thread Dumps进行分析。线程转储是诊断CPU尖峰,死锁,响应时间差,内存问题,应用程序无响应以及其他系统问题的一项重要工作或者环节。

Thread Dump是非常有用的诊断Java应用问题的工具。每一个Java虚拟机都能够以不同的形式及时生成所有线程在某一点状态的Thread-Dump的能力,它能够给我们提供当前活动线程的快照,及JVM中所有Java线程的堆栈跟踪信息,堆栈信息一般包含完整的类名及所执行的方法。通常以文件的形式持久化到磁盘中

1、Jstack

Jstack是捕获线程转储的有效命令行工具。Jstack工具在$JAVA_HOME/bin目录中提供。此处为捕获线程转储所需发出的命令信号:

[administrator@JavaLangOutOfMemory luga ]% jstack -l <pid>> <文件路径>
pid:是应用程序的进程ID,应捕获其线程转储
file-path:是将写入线程转储的文件路径

具体地:

[administrator@JavaLangOutOfMemory luga ]% jstack -l 18790 > javacore.txt

按照如上示例执行,该过程的线程转储信息将在/data/logs/目录下以javacore.txt文本形式生成并进行展示。自Java 5以来,JDK中已包含Jstack工具。如果运行在旧版Java中,请考虑使用其他选项。

2、Kill

在大型企业中,出于安全原因,只有JRE安装在生产机器上。由于Jstack和其他工具只是JDK的一部分,因此有的时候无法使用Jstack工具。在这种情况下,可以使用“ kill -3”选项。

[administrator@JavaLangOutOfMemory luga ]% kill -3 <pid>
pid:是应用程序的进程ID,应捕获其线程转储

具体地:

[administrator@JavaLangOutOfMemory luga ]% kill -3 18790 

使用“ kill -3”选项时,线程转储将发送到标准错误流。如果我们在Tomcat Web容器中运行应用程序,则线程转储将发送到<TOMCAT_HOME> /logs/catalina.out文件中。

备注:目前,大多数* nix操作系统(Unix,Linux,HP-UX操作系统)都支持此选项。 其他操作系统暂未在生产环境实践。

3、Java VisualVM

Java VisualVM是一种图形用户界面工具,可在应用程序在指定的Java虚拟机(JVM)上运行时提供有关应用程序的详细信息。它位于$JAVA_HOME/bin/jvisualvm.exe中。自JDK 6更新7.S起,它是Sun JDK发行版的一部分。

启动Jvisualvm。在左侧面板上,我们会注意到计算机上正在运行的所有Java应用程序。 我们需要从列表中选择所部署的应用程序。 除此之外,此工具还具有从远程主机上运行的java进程捕获线程转储的功能。


4、JMC

Java Mission Control(JMC)是一种工具,可以从本地运行或部署在生产环境中的Java应用程序收集和分析数据。自Oracle JDK 7 Update 40起,此工具已打包到JDK中。该工具还提供了从JVM进行线程转储的选项。位于$JAVA_HOME/bin/jmc.exe目录下。

启动该工具后,我们将看到本地主机上正在运行的所有Java进程。注意:JMC还可以与远程主机上运行的Java进程连接。现在,在左侧面板上,单击要进行线程转储的Java进程下方列出的“ Flight Recorder”选项。现在,我们将会看到“开始飞行记录”向导,如下图所示:

5、Jconsole

Jconsole是JDK自带的监控工具,在$JAVA_HOME/bin目录下可以找到。它用于连接正在运行的本地或者远程的JVM,对运行在java应用程序的资源消耗和性能进行监控,并画出大量的图表,提供强大的可视化界面。而且本身占用的服务器内存很小,甚至可以说几乎不消耗。

JConsole 是一个内置 Java 性能分析器,可以从命令行(直接输入jconsole)或在 GUI shell ($JAVA_HOME/bin下打开)中运行。它用于对JVM中内存,线程和类等的监控。可使用JTop插件。它可以监控本地的Jvm,也可以监控远程的Jvm,也可以同时监控几个Jvm。

这款工具的好处在于,占用系统资源少,而且结合Jstat,可以有效监控到java内存的变动情况,以及引起变动的原因。在项目追踪内存泄露问题时,很实用。

6、ThreadMXBean

从JDK 1.5开始,引入了ThreadMXBean。这是Java虚拟机中线程系统的管理接口。使用此接口,我们还可以生成线程转储。同时只需编写几行代码即可以编程方式生成线程转储。下面是ThreadMXBean实现的框架实现,该实现从应用程序生成Thread Dump。

public void  dumpThreadDump() {
        ThreadMXBean threadMxBean = ManagementFactory.getThreadMXBean();
        for (ThreadInfo ti : threadMxBean.dumpAllThreads(true, true)) {
            System.out.print(ti.toString());
        }
    }

7. APM工具– App Dynamics

很少有应用程序性能监视工具提供生成线程转储的选项。如果要通过App Dynamics(APM工具)监视应用程序,则以下是捕获线程转储的说明:

1、创建一个动作,在“创建动作”窗口中选择“诊断”->“执行线程转储”。

2、输入操作名称,要采样的数量以及线程转储之间的间隔(以毫秒为单位)。

3、如果要在启动线程转储操作之前需要批准,请选中“在此操作之前需要批准”复选框,然后输入被授权批准该操作的个人或组的电子邮件地址。有关更多信息,请参见需要批准的操作。

4、单击确定。

如下所示:

8、JCMD

Jcmd工具是随Oracle Java 7引入的。它对解决JVM应用程序的问题很有用。它具有各种功能,例如,识别Java进程ID,获取堆转储,获取线程转储,获取垃圾收集统计信息等。

[administrator@JavaLangOutOfMemory luga ]%jcmd <pid> Thread.print > <file-path>
pid:是应用程序的进程ID,应捕获其线程转储
file-path:是将写入线程转储的文件路径。

具体地:

[administrator@JavaLangOutOfMemory luga ]%jcmd  37300 Thread.print > /data/logs/threadDump.txt

- EOF -

如果您喜欢本文,欢迎点赞收藏留言,或者点击右下角,把文章分享给你的朋友们~~~

“路,在自己脚下~”

相关推荐

SQL入门知识篇(sql入门新手教程视频)

一、什么是数据库?什么是SQL?1、数据库:存放数据,可以很多人一起使用2、关系数据库:多张表+各表之间的关系3、一张表需要包含列、列名、行4、主键:一列(或一组列),其值能够唯一区分表中的每个行。5...

postgresql实现跨库查询-dblink的妙用

技术导语:用惯了oracle的dblink,转战postgresql,会一时摸不着头脑。本期就重点详细讲解postgresql如何安装dblink模块及如何使用dblink实现跨库查询。安装cont...

Oracle VM VirtualBox虚拟机软件(oracle vm virtualbox win10)

OracleVMVirtualBox是一款完全免费的虚拟机软件,下载银行有提供下载,软件支持安装windows、linux等多个操作系统,让用户可以在一台设备上实现多个操作系统的操作。同时软件有着...

开源 SPL 轻松应对 T+0(开源srs)

T+0问题T+0查询是指实时数据查询,数据查询统计时将涉及到最新产生的数据。在数据量不大时,T+0很容易完成,直接基于生产数据库查询就可以了。但是,当数据量积累到一定程度时,在生产库中进行大数据...

中小企业佳选正睿ZI1TS4-4536服务器评测

随着科技的不断发展,各行各业对于数据使用越加频繁,同时针对服务器的选择方面也就越来越多样化和细分化。那么对于我们用户来说,如何选择符合自身业务需求和最优性价比的产品呢?笔者将通过刚刚购买的这台服务器的...

MFC转QT:Qt基础知识(mfc和qt的区别)

1.Qt框架概述Qt的历史和版本Qt是一个跨平台的C++应用程序开发框架,由挪威公司Trolltech(现为QtCompany)于1991年创建。Qt的发展历程:1991年:Qt项目启动1995年...

数据库,QSqlTableModel(数据库有哪些)

QMYSQL——mysqlQSQLITE——sqliteQOICQ——orcale所需头文件.pro增加sql#include<QSqlDatabase>#include<Q...

python通过oledb连接dbf数据库(python连接jdbc)

起因:因为工作需要,需要读取dbf文件和系统数据中数据进行校对,因为知道dbf文件可以用sql查询,所以想能不能像mysql/oracle那样连接,再调用执行sql方法,通过一系列百度,尝试,最终通过...

Excel常用技能分享与探讨(5-宏与VBA简介 VBA与数据库)

在VBA(VisualBasicforApplications)中使用数据库(如Access、SQLServer、MySQL等)具有以下优点,适用于需要高效数据管理和复杂业务逻辑的场景:1....

Excel常用技能分享与探讨(5-宏与VBA简介 VBA与数据库-二)

以下是常见数据库软件的详细配置步骤,涵盖安装、驱动配置、服务启动及基本设置,确保VBA能够顺利连接:一、MicrosoftAccess适用场景:小型本地数据库,无需独立服务。配置步骤:安装Acces...

Windows Docker 安装(docker安装windows容器)

Docker并非是一个通用的容器工具,它依赖于已存在并运行的Linux内核环境。Docker实质上是在已经运行的Linux下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的L...

Windows下安装Ubuntu虚拟机方法(windows下安装ubuntu20)

在Windows下安装Ubuntu虚拟机。选择使OracleVMVirtualBox安装Ubuntu虚拟机。1.下载和安装OracleVMVirtualBox:访问OracleVMVir...

java入门教程1 - 安装和配置(win和linux)

windows安装和配置安装javahttps://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html目前大部分项目的...

Centos7 安装Tomcat8服务及配置jdk1.8教程

1、下载jdk1.8压缩包下载地址:https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.htmltom...

全网最完整的免费java教程讲义(一)——java配置和安装

一,安装Java1)安装JDK要学习和使用java,首先需要安装JDK(JavaDevelopemntKit),相当于java安装包。Java的下载页在甲骨文官网上:https://www.or...

取消回复欢迎 发表评论: