文档章节

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

BlackJoker
 BlackJoker
发布于 2015/10/13 13:24
字数 476
阅读 12
收藏 0

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)

 

 

 

© 著作权归作者所有

共有 人打赏支持
BlackJoker
粉丝 1
博文 17
码字总数 9270
作品 0
深圳
高级程序员
私信 提问
通过jstack日志分析和问题排查

简介 jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁...

谢思华
06/29
0
0
Java命令行监控工具(jmap,jstack,jstat,jinfo,jps)

项目部署上线之后,线上项目是不能轻易修改的,定位问题的难度也会变大。因此监控是非常重要的一个环节,有了监控,我们才能更好的定位系统中的问题,从而排查。监控的工具有很多种, 但是j...

艾贺521
07/11
0
0
JVM调优工具的使用(jps,jstat,jstack,jmap,jhat)

JDK本身提供了很丰富的性能监控工具,除了集成式的visualVM和jConsole外,还有jstat,jstack,jps,jmap,jhat小工具,这些都是性能调优的常用工具 我们在Java的开发中,常常会遇到下面这些问题:...

super李导
06/23
0
0
JVM命令之jstack深入讲解

在JVM命令使用演示这篇文章里演示了一些jvm命令的使用,这篇文章重点对jstack做一些深入的讲解。 作用 jstack主要用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线...

_Jimin_
07/16
0
0
jstack和线程dump分析

常用性能分析命令和工具: 命令:grep、sort、uniq、awk、dstat、vmstat、ssh、jstack 、jstat -gcutil、top、Jmap –histo:live、 工具:visualVM、JProfiler 一:jstack jstack命令的语法格...

chape
2013/12/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Netty 备录 (一)

入职新公司不久,修修补补1个月的bug,来了点实战性的技术---基于netty即时通信 还好之前对socket有所使用及了解,入手netty应该不是很难吧,好吧,的确有点难,刚看这玩意的时候,可能都不知道哪里...

_大侠__
昨天
4
0
Django简单介绍和用户访问流程

Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。 Django是一个开放源代码的Web应用框架,由Python写成。 Django遵守BSD版权,初...

枫叶云
昨天
8
0
EOS错误代码及中文释义

本文集汇总了EOS区块链常见错误代码及其含义,完整错误代码集请查看 EOS错误代码集 - 汇智网 EOS错误代码列表如下, <table class="table table-striped"> <thead> <tr><th>错误代码</th><t......

汇智网教程
昨天
4
0
Spring Cloud Stream消费失败后的处理策略(四):重新入队(RabbitMQ)

应用场景 之前我们已经通过《Spring Cloud Stream消费失败后的处理策略(一):自动重试》一文介绍了Spring Cloud Stream默认的消息重试功能。本文将介绍RabbitMQ的binder提供的另外一种重试...

程序猿DD
昨天
4
0
kiss原则

KISS 原则是用户体验的高层境界,简单地理解这句话,就是要把一个产品做得连白痴都会用,因而也被称为“懒人原则”。换句话说来,”简单就是美“。KISS 原则源于 David Mamet(大卫马梅)的电...

NB-One
昨天
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部