• 不依赖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)

     

     

     

  • 相关阅读:
    Auto Generate Reflection Information for C++
    面向嵌入式的JavaScript引擎
    如何在unity3d的UGUI中给Text添加材质和艺术字
    获取Unity GLES版本
    PBR原理
    Unity双开
    Unity Shader各种效果
    Redis是什么
    其他地方拷贝过来的VS项目一直报错不能启动IIS
    IIS部署PHP项目并与mysql完美结合
  • 原文地址:https://www.cnblogs.com/cwjcsu/p/8433062.html
Copyright © 2020-2023  润新知