BTrace脚本杀死Java虚拟机线程

时间:2013-04-09 20:18:40

标签: java multithreading kill visualvm btrace

VisualVM支持执行不安全的BTrace脚本(https://kenai.com/projects/btrace/pages/UserGuide)。是否可以使用不安全的BTrace脚本来杀死/中断某些Java线程?我的Eclipse IDE中的一些线程已经死锁,我想优雅地关闭IDE。

  

“Worker-3571”prio = 6 tid = 0x00000000114b7800 nid = 0x964等待监视器输入[0x000000002a45f000]      java.lang.Thread.State:BLOCKED(在对象监视器上)     at org.eclipse.jdt.internal.ui.viewsupport.SelectionListenerWithASTManager $ PartListenerGroup $ 3.run(SelectionListenerWithASTManager.java:155)      - 等待锁定< 0x00000000f7490ce8> (一个java.lang.Object)     在org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)

     

“Worker-3568”prio = 6 tid = 0x00000000114b9000 nid = 0x2984等待监视器输入[0x000000002958f000]      java.lang.Thread.State:BLOCKED(在对象监视器上)     at org.eclipse.jdt.internal.ui.viewsupport.SelectionListenerWithASTManager $ PartListenerGroup $ 3.run(SelectionListenerWithASTManager.java:155)      - 等待锁定< 0x00000000f7490ce8> (一个java.lang.Object)     在org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)

     

“Worker-3570”prio = 6 tid = 0x00000000114bc000 nid = 0x1980 in Object.wait()[0x000000002998f000]      java.lang.Thread.State:WAITING(在对象监视器上)     at java.lang.Object.wait(Native Method)     在java.lang.Object.wait(Object.java:503)     在org.eclipse.jdt.internal.ui.javaeditor.ASTProvider.getAST(ASTProvider.java:457)      - 已锁定< 0x00000000e10979a0> (一个java.lang.Object)     在org.eclipse.jdt.ui.SharedASTProvider.getAST(SharedASTProvider.java:128)     at org.eclipse.jdt.internal.ui.viewsupport.SelectionListenerWithASTManager $ PartListenerGroup.calculateASTandInform(SelectionListenerWithASTManager.java:170)     at org.eclipse.jdt.internal.ui.viewsupport.SelectionListenerWithASTManager $ PartListenerGroup $ 3.run(SelectionListenerWithASTManager.java:155)      - 已锁定< 0x00000000f7490ce8> (一个java.lang.Object)     在org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)

1 个答案:

答案 0 :(得分:1)

不,由于以下原因,无法做到这一点:

  1. BTrace仅支持Java API提供的功能。没有Java API可以杀死任意线程。
  2. BTrace使用类重新转换来注入其代码。即使修改了类字节码,当前堆栈上的所有方法都会继续使用原始字节码,并且只有当它们离开堆栈时才会交换到新版本(返回,异常)。这意味着当您的线程被卡住(特别是等待/阻塞)时,您要检测的方法将保留在堆栈中,并且永远不会应用新的字节码。
  3. 基于JPDA的解决方案(例如,jdb,youdebug)将会更加幸运。