1

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 (on object monitor) at org.eclipse.jdt.internal.ui.viewsupport.SelectionListenerWithASTManager$ PartListenerGroup$3.run(SelectionListenerWithASTManager.java:155) - 等待在 org.eclipse.core.internal.jobs.Worker.run(Worker.java:53) 处锁定 <0x00000000f7490ce8> (一个 java.lang.Object)

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

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

4

1 回答 1

1

不,由于以下原因不能这样做:

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

使用基于 JPDA 的解决方案(例如 jdb、youdebug)会让您更加幸运

于 2013-04-11T09:02:12.293 回答