java线程dump可以使用jdk的命令“jstack pid”完成,死锁检查可以用jconsole查看到。这两个工具是java调试的常用方法。
我遇到的问题是:在sles11sp3的服务上面测试,上面只有IBM J9 VM jre,默认没有装jdk,装了jdk后发现没有jstack命令,由于系统没有启动图形界面,jconsole也无法使用,最后安装了vnc server,在xterm里面打开jconsole才定位到问题。
于是我想做一个不依赖jdk,在J9 VM jre和oracle的 jre下都可以打印堆栈的工具。于是就有了下面的东西。
这个工具只能获取到当前JVM的堆栈,需要通过外围的接口输出,比如http server、web service等等。代码主要是从jconsole的源码里面弄出来的。输出的格式和jstack一致。
原理是使用ThreadMXBean获取线程栈信息,然后输出,
ThreadMXBean rtb = ManagementFactory.getThreadMXBean();....
里面的_.$是一个MessageFormater工具类方法,我使用的是org.slf4j.helpers.MessageFormatter,没有上传。
测试用例输出如下,可以看出t1和t2死锁了。
2014-09-04 15:08:57.565 Full thread dump Java HotSpot(TM) 64-Bit Server VM Sun Microsystems Inc. 20.45-b01 deadlock #0:t1 - t2 "t2" with id 10,state:BLOCKED on java.lang.Object@3ea981ca owned by t1 ,blocked:2,waited:0 com.skybility.ha.cmm.common.trace.DeadLock1.method2(DeadLock1.java:22) - locked java.lang.Object@6d9efb05 com.skybility.ha.cmm.common.trace.DeadLock1$Thread2.run(DeadLock1.java:50) "t1" with id 9,state:BLOCKED on java.lang.Object@6d9efb05 owned by t2 ,blocked:3,waited:0 com.skybility.ha.cmm.common.trace.DeadLock1.method1(DeadLock1.java:12) - locked java.lang.Object@3ea981ca com.skybility.ha.cmm.common.trace.DeadLock1$Thread1.run(DeadLock1.java:36) "Attach Listener" with id 5,state: RUNNABLE,blocked:0,waited:0 "Signal Dispatcher" with id 4,state: RUNNABLE,blocked:0,waited:0 "Finalizer" with id 3,state:WAITING on java.lang.ref.ReferenceQueue$Lock@6a8814e9 ,blocked:0,waited:1 java.lang.Object.wait(Native Method) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134) java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:171) "Reference Handler" with id 2,state:WAITING on java.lang.ref.Reference$Lock@c1503a3 ,blocked:0,waited:1 java.lang.Object.wait(Native Method) java.lang.Object.wait(Object.java:485) java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116) "main" with id 1,state: RUNNABLE,blocked:0,waited:1 sun.management.ThreadImpl.dumpThreads0(Native Method) sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:433) com.skybility.ha.cmm.common.ThreadDumper.dump(ThreadDumper.java:31) com.skybility.ha.cmm.common.trace.TestStackDump.main(TestStackDump.java:22)
相关推荐
Java线程Dump分析工具jstack是Java开发人员和运维人员常用的诊断工具,它能够帮助我们了解Java应用程序中线程的状态,以及线程的执行轨迹。本文将深入解析jstack的使用方法及其在不同场景下的应用。 jstack命令的...
通过`jstack`命令(Java堆栈跟踪工具),我们可以获取到应用的线程快照,即dump线程,从而分析是否存在死锁。`jstack`命令可以显示所有线程的状态,包括它们的堆栈跟踪,这对于定位死锁非常有帮助。 3. **使用...
对于线程dump,除了jstack之外,还可以使用jvisualvm等工具进行图形化分析,这为开发者提供了更为直观的线程状态视图。 总而言之,jstack是一个功能强大的工具,可以协助开发者深入理解Java应用程序的运行状态,...
`jstack`命令是Java开发中用于诊断线程堆栈信息的重要工具,它可以帮助开发者了解Java应用程序的线程状态,包括运行、等待、阻塞等,以及是否存在死锁等问题。当遇到性能问题或者线程卡住不前时,`jstack`能提供关键...
线程 Dump 分析是 IT 系统性能优化中不可或缺的一部分,尤其在 Java 应用程序中,当系统出现响应慢或者卡死等异常情况时,通过获取和分析线程 Dump 文件,我们可以找出导致问题的线程,定位内存泄漏、死锁等问题。...
### JStack和Java Thread Dumps分析 #### 一、引言 在Java应用程序开发与维护过程中,时常会遇到性能瓶颈或死锁等问题。这些问题往往难以定位,尤其当系统处于高负载下时,更是如此。此时,`JStack`工具便显得尤为...
TDA(Thread Dump Analyzer)是一款强大的Java线程分析工具,它能够帮助开发者深入理解应用在运行时的线程状态,包括线程的阻塞情况、等待资源、死锁等问题。下面将详细介绍TDA的使用方法、功能以及它如何帮助我们...
通过命令`jstack`(Java堆栈跟踪工具)可以方便地生成线程Dump文件。然而,对于大型系统来说,Dump文件中的信息量巨大,手工分析往往耗时且困难,难以快速定位问题所在。 这就是`TDA`发挥作用的地方。它具备以下...
其中,`jstack` 命令是一个 Java 命令行工具,用于生成 Thread Dump。 在 Unix 系统中,可以使用 `kill -3 <pid>` 命令来获取 Thread Dump,其中 `<pid>` 是 JVM 进程的进程 ID。在 Windows 系统中,可以按下 CTRL+...
《深入解析JVM线程Dump日志:剖析线程状态与优化策略》 线程状态是理解Java应用程序性能的关键因素之一。JVM提供了一个强大的工具——`jstack`,用于生成线程堆栈转储,即Thread Dump,帮助开发者洞察线程的运行...
Java内存dump分析和Thread Dump(Java Core)是Java性能调优中的重要环节,它们能帮助开发者定位和解决系统中的各种问题,如内存泄漏、线程阻塞等。下面将详细介绍这两个概念及其分析工具。 首先,Java堆内存dump,...
线程Dump日志提供了详细的线程状态和调用栈信息,这对于理解和解决线程阻塞、死锁等问题至关重要。如果堆栈信息显示应用代码,通常意味着线程正在等待资源,可能是由于资源锁定或等待其他线程完成特定操作。 【正文...
TDA(Thread Dump Analyzer)是一个专门用于解析和分析Java线程Dump的日志文件的工具,它可以帮助开发者快速定位线程阻塞、死锁等问题,从而优化应用程序的性能。 **一、什么是线程Dump** 线程Dump是Java虚拟机在...
本文将详细探讨Java内存分析、dump分析、jmap和jstack工具的使用,以及如何利用这些工具进行堆栈分析。 首先,Java内存分析主要关注的是程序运行时的内存分配和管理。Java内存分为堆内存(Heap)、栈内存(Stack)...
本文将深入探讨Java线程Dump的概念、生成方式以及如何通过分析线程Dump来诊断和解决性能瓶颈。 **第1章 JAVA线程DUMP** 1.1 什么是JAVA线程DUMP Java线程Dump,也称为线程快照,是JVM在特定时刻捕获的所有活动...
3. **jstack命令**: jstack是JDK提供的命令行工具,用于打印Java应用程序的线程堆栈信息,这对于定位死锁和阻塞问题非常有用。 三、Java API提供的线程监控 1. **Thread类**: Java中的Thread类提供了获取当前线程、...
- **组合使用jstack和tda**:在遇到Java应用性能问题或者线程异常时,先用`jstack`生成Thread Dump,然后使用tda进行解析和分析,这样可以提高问题定位的效率和准确性。 - **线程分析**:tda可以识别出可能的死锁...
Java线程 Dump(Thread Dump)是Java应用程序在特定时间点的线程状态快照,它包含每个线程的详细信息,如线程ID、线程名称、线程状态以及调用堆栈。当Java应用程序出现性能问题、死锁或者线程阻塞等情况时,Thread ...
`jstack` 是一个 Java 命令行工具,用于查看 Java 进程的线程 Dump 信息。使用 `jstack` 命令可以查看 Java 进程中的线程信息,包括线程的名称、状态、调用栈等信息。 例如,使用 `jstack -l pid` 命令可以查看指定...