2013-04-09 72 views
1

VisualVM支持执行不安全的BTrace脚本(https://kenai.com/projects/btrace/pages/UserGuide)。是否有可能使用不安全的BTrace脚本来终止/中断某个Java线程?我的Eclipse IDE中的一些线程死锁,我想正常关闭IDE。BTrace脚本杀死Java虚拟机Thread

“工人-3571” PRIO = 6 TID = 0x00000000114b7800 NID = 0x964等待监视器条目[0x000000002a45f000] java.lang.Thread.State中:BLOCKED(对象监视器上) 在org.eclipse.jdt。 internal.ui.viewsupport.SelectionListenerWithASTManager $ PartListenerGroup $ 3.run(SelectionListenerWithASTManager.java:155) - 等待锁定< 0x00000000f7490ce8>(java.lang.Object) at org.eclipse.core.internal.jobs.Worker.run (Worker.java:53)

“Worker-3568”prio = 6 tid = 0x00000000114b9000 nid = 0x2984等待监视器条目[0x000000002958f000] java.lang.Thread.State中:BLOCKED(对象监视器上) 在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)

“工人-3570” PRIO = 6 TID = 0x00000000114bc000 NID = 0x1980在对象.wait()[0x000000002998f000] java.lang.Thread.State:WAITING(在对象监视器上) at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:503 ) at org.eclipse.jdt.internal.ui.javaeditor.ASTProvider.getAST(ASTProvider。 java:457) - 锁定< 0x00000000e10979a0>(java.lang.Object) at org.eclipse.jdt.ui.SharedASTProvider.getAST(SharedASTProvider.java:128) at org.eclipse.jdt.internal.ui。 viewsupport.SelectionListenerWithASTManager $ PartListenerGroup.calculateASTandInform(SelectionListenerWithASTManager.java:170) 在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)

+0

我不知道有什么办法可以杀掉从JVM的除了JMX或一些其他通信外螺纹。 – Gray 2013-04-09 20:20:07

+0

迄今为止发现的最接近的是http://stackoverflow.com/questions/11610902/how-to-kill-a-java-thread-using-visualvm-or-using-a-unix-command/15911133# 15911133 – buzz3791 2013-04-09 20:33:34

+0

Java不支持“查杀”线程。有没有什么BTrace可以帮助你:( – 2013-04-10 13:09:40

回答

1

不,这不能做原因如下:

  1. BTrace仅支持通过Java API提供的功能。没有Java API来杀死任意线程。
  2. BTrace使用类重新转换来注入其代码。即使类字节码被修改,当前堆栈中的所有方法仍然使用原始字节码,并且只有当它们离开堆栈时才会交换到新版本(返回,异常)。这意味着当你的线程被卡住(特别是WAITING/BLOCKED)时,你想要工具的方法被保留在堆栈上,并且新的字节码不会被应用。

你将有更多的运气与基于JPDA的解决方案(如加多宝,youdebug)