`
OpenMind
  • 浏览: 179792 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

不依赖jstack的java 线程dump和死锁检查工具

 
阅读更多

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)

 

 

 

分享到:
评论
1 楼 OpenMind 2014-01-17  
今天发现,在linux下还有个很简介的方法查看线程的转储信息,就是kill -3 pid,dump信息会输出到标准输出流里面。

相关推荐

    Java线程Dump分析工具jstack解析及使用场景

    Java线程Dump分析工具jstack是Java开发人员和运维人员常用的诊断工具,它能够帮助我们了解Java应用程序中线程的状态,以及线程的执行轨迹。本文将深入解析jstack的使用方法及其在不同场景下的应用。 jstack命令的...

    dump线程让死锁无处可逃

    通过`jstack`命令(Java堆栈跟踪工具),我们可以获取到应用的线程快照,即dump线程,从而分析是否存在死锁。`jstack`命令可以显示所有线程的状态,包括它们的堆栈跟踪,这对于定位死锁非常有帮助。 3. **使用...

    jstack和线程dump实例解析

    对于线程dump,除了jstack之外,还可以使用jvisualvm等工具进行图形化分析,这为开发者提供了更为直观的线程状态视图。 总而言之,jstack是一个功能强大的工具,可以协助开发者深入理解Java应用程序的运行状态,...

    如何通过jstack命令dump线程信息

    `jstack`命令是Java开发中用于诊断线程堆栈信息的重要工具,它可以帮助开发者了解Java应用程序的线程状态,包括运行、等待、阻塞等,以及是否存在死锁等问题。当遇到性能问题或者线程卡住不前时,`jstack`能提供关键...

    tda分析线程dump的工具

    线程 Dump 分析是 IT 系统性能优化中不可或缺的一部分,尤其在 Java 应用程序中,当系统出现响应慢或者卡死等异常情况时,通过获取和分析线程 Dump 文件,我们可以找出导致问题的线程,定位内存泄漏、死锁等问题。...

    JStack和Java Thread Dumps分析

    ### JStack和Java Thread Dumps分析 #### 一、引言 在Java应用程序开发与维护过程中,时常会遇到性能瓶颈或死锁等问题。这些问题往往难以定位,尤其当系统处于高负载下时,更是如此。此时,`JStack`工具便显得尤为...

    java线程分析工具TDA

    TDA(Thread Dump Analyzer)是一款强大的Java线程分析工具,它能够帮助开发者深入理解应用在运行时的线程状态,包括线程的阻塞情况、等待资源、死锁等问题。下面将详细介绍TDA的使用方法、功能以及它如何帮助我们...

    TDA.ZIP 线程dump分析工具

    通过命令`jstack`(Java堆栈跟踪工具)可以方便地生成线程Dump文件。然而,对于大型系统来说,Dump文件中的信息量巨大,手工分析往往耗时且困难,难以快速定位问题所在。 这就是`TDA`发挥作用的地方。它具备以下...

    java thread dump 分析

    其中,`jstack` 命令是一个 Java 命令行工具,用于生成 Thread Dump。 在 Unix 系统中,可以使用 `kill -3 <pid>` 命令来获取 Thread Dump,其中 `<pid>` 是 JVM 进程的进程 ID。在 Windows 系统中,可以按下 CTRL+...

    jstack生成的Thread Dump日志.docx

    《深入解析JVM线程Dump日志:剖析线程状态与优化策略》 线程状态是理解Java应用程序性能的关键因素之一。JVM提供了一个强大的工具——`jstack`,用于生成线程堆栈转储,即Thread Dump,帮助开发者洞察线程的运行...

    java 内存dump分析和thread dump(java core)分析

    Java内存dump分析和Thread Dump(Java Core)是Java性能调优中的重要环节,它们能帮助开发者定位和解决系统中的各种问题,如内存泄漏、线程阻塞等。下面将详细介绍这两个概念及其分析工具。 首先,Java堆内存dump,...

    jstack生成的Thread Dump日志1

    线程Dump日志提供了详细的线程状态和调用栈信息,这对于理解和解决线程阻塞、死锁等问题至关重要。如果堆栈信息显示应用代码,通常意味着线程正在等待资源,可能是由于资源锁定或等待其他线程完成特定操作。 【正文...

    java dump分析工具ha456

    本文将详细探讨Java内存分析、dump分析、jmap和jstack工具的使用,以及如何利用这些工具进行堆栈分析。 首先,Java内存分析主要关注的是程序运行时的内存分配和管理。Java内存分为堆内存(Heap)、栈内存(Stack)...

    TDA-Thread Dump Analyzer - tda-bin-2.3.3.zip

    TDA(Thread Dump Analyzer)是一个专门用于解析和分析Java线程Dump的日志文件的工具,它可以帮助开发者快速定位线程阻塞、死锁等问题,从而优化应用程序的性能。 **一、什么是线程Dump** 线程Dump是Java虚拟机在...

    java thread 分析

    本文将深入探讨Java线程Dump的概念、生成方式以及如何通过分析线程Dump来诊断和解决性能瓶颈。 **第1章 JAVA线程DUMP** 1.1 什么是JAVA线程DUMP Java线程Dump,也称为线程快照,是JVM在特定时刻捕获的所有活动...

    java 监控线程

    3. **jstack命令**: jstack是JDK提供的命令行工具,用于打印Java应用程序的线程堆栈信息,这对于定位死锁和阻塞问题非常有用。 三、Java API提供的线程监控 1. **Thread类**: Java中的Thread类提供了获取当前线程、...

    tda看ThreadDump文件

    - **组合使用jstack和tda**:在遇到Java应用性能问题或者线程异常时,先用`jstack`生成Thread Dump,然后使用tda进行解析和分析,这样可以提高问题定位的效率和准确性。 - **线程分析**:tda可以识别出可能的死锁...

    java故障排查ThreadDump

    Java线程 Dump(Thread Dump)是Java应用程序在特定时间点的线程状态快照,它包含每个线程的详细信息,如线程ID、线程名称、线程状态以及调用堆栈。当Java应用程序出现性能问题、死锁或者线程阻塞等情况时,Thread ...

    一起学习java stack 的信息,如何查看

    `jstack` 是一个 Java 命令行工具,用于查看 Java 进程的线程 Dump 信息。使用 `jstack` 命令可以查看 Java 进程中的线程信息,包括线程的名称、状态、调用栈等信息。 例如,使用 `jstack -l pid` 命令可以查看指定...

Global site tag (gtag.js) - Google Analytics