不依赖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)
不依赖jstack的java 线程dump和死锁检查工具的更多相关文章
- JAVA线程dump的分析
Java 的线程 线程是指能独立于程序的其它部分运行的执行单元. JAVA语言能够很好的实现多线程的程序.我们在调试程序,或者在开发后期需要做性能调优的时候,往往也需要了解当前程序正在运行的线程的状态 ...
- java线程dump分析工具
jstack和线程dump分析 java程序性能分析之thread dump和heap dump 一.[内存dump] jmap –dump:live,format=b,file=heap.bin ...
- JVM探秘:jstack查看Java线程状态
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. jstack命令可以打印Java进程的各个线程堆栈跟踪信息,可以用来查看Java中各个 ...
- Java线程Dump分析工具--jstack【转载】
jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使 ...
- Java线程Dump分析工具--jstack(转)
jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使 ...
- Java线程Dump分析工具--jstack
jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使 ...
- 使用jstack和TDA进行java线程dump分析
转载:http://blog.csdn.net/everlasting_188/article/details/51943095 1.jstack重点关注 命令行:jstack [-l][F] pid ...
- C2 CompilerThread0 如果抓到的java线程dump里占用CPU最高的线程是这个,99%可能是因为服务重启了
"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 tid=0x00007f20c80b3800 nid=0x57c0 runnable ...
- java 线程同步、死锁
转载地址:速学堂 https://www.sxt.cn/Java_jQuery_in_action/eleven-thread-synchronization.html 什么是线程同步 同步问题的提 ...
随机推荐
- 学习笔记-express路径问题
在页面渲染成功之后,报错出现静态文件css样式引用路径出错,于是我就根据express api文档,托管静态文件作出修改,最后全是徒劳.于是我又从引用开始找起,<link rel="s ...
- CTF---Web入门第十三题 拐弯抹角
拐弯抹角分值:10 来源: cwk32 难度:易 参与人数:5765人 Get Flag:2089人 答题人数:2143人 解题通过率:97% 如何欺骗服务器,才能拿到Flag? 格式:CTF{} 解 ...
- BZOJ:1443: [JSOI2009]游戏Game
原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1443 反正不看题解我是完全想不出系列…… 先把棋盘黑白染色,也就是同一对角线上颜色相同,使 ...
- UVA 1030 - Image Is Everything【模拟+思维+迭代更新】
题目链接:uva 1030 - Image Is Everything 题目大意:有一个最大为n*n*n的立方体的一个不规整立体,由若干个1*1*1的小正方体构成(每一个小正方体被涂成不同的颜色),给 ...
- 线段树入门HDU_1754
题目链接:点击打开链接 I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- angular2 路由
路由是个模块,命令行生成:ng generate module routerTest; 自己组建: 路由模块说明: Routes:路由配置,路由配置文件类型.比如:const routing:Rout ...
- Linux中git的使用
之前在windows中一直采用github的桌面版,库的建立更新都是借助软件的帮助.所使用的的功能也非常局限,仅仅只是创建库再提交自己的代码.至于版本管理.回滚.分支以及git的结构都没有清楚的认识. ...
- 淘淘商城学习笔记 之 上传图片到远程服务器,图片的回显出现的bug
最近在学习淘淘商城中用到的技术,感觉受益良多,遇到一个比较奇怪的bug调了好久,遂心乐之分享于诸君 bug情况是这样的:在商城的后台上传图片之后图片回显不出来,右键查看链接,发现链接被加了localh ...
- // 关闭调试模式 define('APP_DEBUG', false);
调试模式的优势在于: 开启日志记录,任何错误信息和调试信息都会详细记录,便于调试: 关闭模板缓存,模板修改可以即时生效: 记录SQL日志,方便分析SQL: 关闭字段缓存,数据表字段修改不受缓存影响: ...
- 使用git bash提交代码到github托管
1.首先登录到https://github.com注册Github帐号,并且创建一个repository. 或者登录到 https://git.oschina.net/注册账号,并且创建一个rep ...