2013-04-09 111 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)