2012-01-20 2 views
5

Java 첨부 API를 사용하여 로컬 JVM에 연결하고 있습니다. 내가 가상 머신 경우 난에 연결하고, 윈도우 머신에서 실행되는 다음java VirtualMachine.getSystemProperties() deadlock

VirtualMachine vm = VirtualMachine.attach("8400"); 
Properties props = vm.getSystemProperties(); 

같은 일을하고있어 사이에 종료되는 연결하고의 GetSystemProperties 호출, getSystemProperties() 영원히 차단하고 해당 스레드에서 교착 상태를 생성합니다. 블록을 추적하여 WindowsVirtualMachine.connectPipe()까지 추적했습니다. 이는 네이티브 메서드이므로 WindowsVirtualMachine.c connectPipe 함수에는 ConnectNamedPipe가 호출됩니다. Windows 컴퓨터에서 ConnectNamedPipe 교착 상태에 대한 몇 가지 게시물을 보았습니다. 나는 차단 된 스레드를 중단 시키려고 시도했지만 스레드를 차단 해제하지는 않습니다.

해결 방법은 무엇인지 모르겠지만 Attach API를 사용하지 않는 것이 좋습니다 (현재 솔루션을 계속 사용하는 편이 좋음). 첨부 API를 사용하여 VirtualMachine.list()을 사용하여 로컬 시스템에서 실행중인 JVM을 가져옵니다. 그리고 거기에서 나는 그것을 사용하여 시스템 속성을 얻고 JMX를 통해 그들과 연결합니다. 아마 네트워크를 통해 프로세스간에 통신하는 라이브러리를 사용하여 사용자 지정 솔루션을 만들 수 있지만 오히려 첨부 파일 API를 사용하는 것입니다 프로세스간에 os 수준의 통신을 사용하고 싶습니다.

제 질문은 거기에 내 문제에 대한 해결 방법이 있습니까? 또는 VirtualMachine.list()과 동일한 기능을 제공 할 수있는 라이브러리가 있습니까?

+0

스레드 인터럽트가 작동하지 않는다는 것은 무엇을 의미합니까? 아무것도 안해? – Adrian

+0

차단 된 스레드를 차단해도 차단되지 않습니다. – mikey

+1

또한 스레드를 중지()하려고합니다 (어느 쪽이 좋을지는 모르겠지만 어떻게 동작하는지보십시오). 인터럽트를위한 문서는 다음과 같습니다. http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#interrupt%28%29 – Adrian

답변

0

이 경우 어떻게 하시겠습니까? 이와 같은 문제에 대한 일반적인 해결책은 스레드가 작업을 마칠 때까지 기다리는 감시자 스레드를 갖는 것입니다. 그런 다음 일정 시간 동안 완료하지 않으면 교착 상태가 발생하여 프로세스를 종료합니다. 분명히 이것은 꽤 무거워지만이 경우에는 할 수있는 것이별로 없다. 그것은 '정확하다'.