Java ThreadDump 生成解析

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

      当有我们的服务器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容器中运行应用程序,则线程转储将发送到 /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
相关文章
|
2月前
|
机器学习/深度学习 JSON Java
Java调用Python的5种实用方案:从简单到进阶的全场景解析
在机器学习与大数据融合背景下,Java与Python协同开发成为企业常见需求。本文通过真实案例解析5种主流调用方案,涵盖脚本调用到微服务架构,助力开发者根据业务场景选择最优方案,提升开发效率与系统性能。
718 0
|
2月前
|
Java
Java的CAS机制深度解析
CAS(Compare-And-Swap)是并发编程中的原子操作,用于实现多线程环境下的无锁数据同步。它通过比较内存值与预期值,决定是否更新值,从而避免锁的使用。CAS广泛应用于Java的原子类和并发包中,如AtomicInteger和ConcurrentHashMap,提升了并发性能。尽管CAS具有高性能、无死锁等优点,但也存在ABA问题、循环开销大及仅支持单变量原子操作等缺点。合理使用CAS,结合实际场景选择同步机制,能有效提升程序性能。
|
2月前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
434 100
|
3月前
|
存储 缓存 Java
Java数组全解析:一维、多维与内存模型
本文深入解析Java数组的内存布局与操作技巧,涵盖一维及多维数组的声明、初始化、内存模型,以及数组常见陷阱和性能优化。通过图文结合的方式帮助开发者彻底理解数组本质,并提供Arrays工具类的实用方法与面试高频问题解析,助你掌握数组核心知识,避免常见错误。
|
3月前
|
缓存 安全 Java
Java并发性能优化|读写锁与互斥锁解析
本文深入解析Java中两种核心锁机制——互斥锁与读写锁,通过概念对比、代码示例及性能测试,揭示其适用场景。互斥锁适用于写多或强一致性场景,读写锁则在读多写少时显著提升并发性能。结合锁降级、公平模式等高级特性,助你编写高效稳定的并发程序。
238 0
|
1月前
|
存储 安全 Java
《数据之美》:Java集合框架全景解析
Java集合框架是数据管理的核心工具,涵盖List、Set、Map等体系,提供丰富接口与实现类,支持高效的数据操作与算法处理。
|
2月前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
1月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
2月前
|
安全 Java API
Java SE 与 Java EE 区别解析及应用场景对比
在Java编程世界中,Java SE(Java Standard Edition)和Java EE(Java Enterprise Edition)是两个重要的平台版本,它们各自有着独特的定位和应用场景。理解它们之间的差异,对于开发者选择合适的技术栈进行项目开发至关重要。
394 1
|
3月前
|
安全 Oracle Java
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
308 0
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡

推荐镜像

更多
  • DNS
  • 下一篇
    oss云网关配置