Сценарий BTrace для уничтожения потока виртуальной машины Java

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: ЗАБЛОКИРОВАНО (на мониторе объектов) в org.eclipse.jdt.internal. $ui.viewsupport.SelectionListenerWithASTMan 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: ЗАБЛОКИРОВАНО (на мониторе объекта) в 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 в Object.wait () [0x000000002998f000] java.lang.Thread.State: WAITING (на мониторе объектов) в java.lang.Object.wait (собственный метод) в java.lang.Object.wait (Object.java:503) в org.eclipse.jdt.internal.ui.javaeditor.ASTProvider.getAST (ASTProvider.java:457) - заблокировано ‹0x00000000e10979a0> (объект java.lang.) по адресу org.eclipse.jdt.ui.SharedASTProvider.getAST (SharedASTProvider.java:128) по адресу org.eclipse.jdt.internal.ui.viewsupport.SelectionListenerWithASTManager $ PartListenerGroup.calculateASTandInform (AtomListenerWjava.java: TMan70). .internal.ui.viewsupport.SelectionListenerWithASTManager $ PartListenerGroup $ 3.run (SelectionListenerWithASTManager.java:155) - заблокирован ‹0x00000000f7490ce8> (java.lang.Object) в org.eclipse.core.internal.jobs.Worker.run (Worker. java: 53)


person buzz3791    schedule 09.04.2013    source источник
comment
Я не уверен, что есть способ убить поток вне JVM, кроме JMX или некоторых других коммуникаций.   -  person Gray    schedule 10.04.2013
comment
Ближайшее, что я нашел до сих пор, - это stackoverflow.com/questions/11610902/   -  person buzz3791    schedule 10.04.2013
comment
Java не поддерживает убивающие потоки. BTrace ничем не может вам помочь :(   -  person JB-    schedule 10.04.2013
comment
Одна из моих идей - это сценарий BTrace, который добавляет java.lang.reflect.Proxy, относящийся к одному из потоков, вовлеченных в тупик. Тогда мне все еще понадобится способ прервать один из потоков WAITING / BLOCKED.   -  person buzz3791    schedule 10.04.2013
comment
По-прежнему нет ответа. Вот один ответ, в котором утверждается, что BTrace не может этого сделать ... kenai.com/projects/btrace/forums/forum/topics/   -  person buzz3791    schedule 10.04.2013


Ответы (1)


Нет, это невозможно по следующим причинам:

  1. BTrace поддерживает только то, что доступно через API Java. Не существует Java API для уничтожения произвольного потока.
  2. BTrace использует повторное преобразование класса для внедрения своего кода. Несмотря на то, что байт-код класса изменен, все методы, которые в настоящее время находятся в стеке, продолжают использовать исходный байт-код и заменяются на новую версию только тогда, когда они покидают стек (возврат, исключение). Это означает, что, когда ваш поток застревает (особенно WAITING / BLOCKED), метод, который вы хотите инструментировать, сохраняется в стеке, а новый байт-код никогда не применяется.

Вам больше повезет с решениями на основе JPDA (например, jdb, youdebug).

person JB-    schedule 11.04.2013