2013-04-09 8 views
1

VisualVM은 안전하지 않은 BTrace 스크립트 (https://kenai.com/projects/btrace/pages/UserGuide)의 실행을 지원합니다. 안전하지 않은 BTrace 스크립트를 사용하여 일부 Java 스레드를 중지/중단 할 수 있습니까? 내 Eclipse IDE의 일부 스레드가 교착 상태이므로 IDE를 정상적으로 종료하고 싶습니다.자바 가상 머신 죽이기 BTrace 스크립트

"작업자 3571"프리 오 = 6 TID = 0x00000000114b7800 NID = 0x964 모니터 항목 [0x000000002a45f000] java.lang.Thread.State에 대기 : org.eclipse.jdt에서 (오브젝트 모니터)의 슈팅 .- 잠글 기다림 < 0x00000000f7490ce8> (a 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 (객체 모니터에서) at org.eclipse.jdt.internal.ui.viewsupport.SelectionListenerWithASTManager $ PartListenerGroup $ 3.run (SelectionListenerWithASTManager.java:155) - 잠금 대기 중 < 0x00000000f7490ce8> org.eclipse.core.internal.jobs.Worker.run에서 (a java.lang.Object 상위) (Worker.java:53)

"작업자 3570"프리 오 = 6 TID = 0x00000000114bc000 NID = 0x1980 개체에서 .wait() [0x000000002998f000] java.lang.Thread.State : WAITING (객체 모니터에서) at java.lang.Object.wait (기본 메소드) at java.lang.Object.wait (Object.java:503)) at org.eclipse.jdt.internal.ui.javaeditor.ASTProvider.getAST (ASTProvider. java : 457) - 잠김 < 0x00000000e10979a0> (a 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> (자바를 고정 org.eclipse.core.internal.jobs.Worker.run에서 .lang.Object) (Worker.java:53)

+0

을 JPDA 기반 솔루션 (예. JDB, youdebug) 더 많은 행운을해야합니다 . – Gray

+0

가장 가까운 곳은 지금까지 발견되었습니다. http://stackoverflow.com/questions/11610902/how-to-kill-a-java-thread-using-visualvm-or-using-a-unix-command/15911133# 15911133 – buzz3791

+0

Java는 "kill"스레드를 지원하지 않습니다.BTrace가 당신을 도울 수있는 것이 아무것도 없다. ( –

답변

1

아니, 이건 할 수 없습니다 다음과 같은 이유 때문입니다.

  1. BTrace는 Java API를 통해 사용 가능한 것을 지원합니다. 임의의 스레드를 종료하는 Java API는 없습니다.
  2. BTrace는 클래스 재 변환을 사용하여 코드를 주입합니다. 클래스 바이트 코드가 수정 되더라도 현재 스택에있는 모든 메소드는 원래 바이트 코드를 사용하여 계속 유지되며 스택에서 나갈 때만 새 버전으로 스왑됩니다 (반환, 예외). 스레드가 멈췄을 때 (특히 WAITING/BLOCKED) 계측 할 메소드가 스택에 보관되고 새 바이트 코드가 적용되지 않는다는 것을 의미합니다.

당신은 내가 JMX에서 옆으로 JVM의 외부 또는 다른 통신에서 스레드를 죽일 수있는 방법이 확실하지 않다