2012-04-23 4 views
2

많은 데이터를 구독하고이 데이터를 다양한 방법으로 표시하는 Java 스윙 응용 프로그램이 있습니다. 로드가 많은 상황에서 JRE가 "Java (TM) Platform SE 바이너리가 작동을 멈췄습니다."라는 메시지로 인해 작업이 중지된다는 것을 알게되었습니다. 이것은 분명히 내 응용 프로그램을 종료하고 다시 시작해야합니다. 내 코드 또는 내가 할 수있는 일은 stacktrace가 없지만 JRE를 업그레이드/다시 설치하고 바이러스 검사를 실행하는 것 외에는 거의 유용한 정보를 찾지 못했기 때문에이 문제를 해결하는 방법을 찾기 위해 Google에 노력했습니다. 이 두 조치를 모두 수행하고 서버를 재부팅했지만 문제는 계속 발생합니다. 자바 VisualVM (아래 덤프 참조)으로 프로세스를 모니터하려고했지만이 도구에 대한 전문가가 아니며 무엇을 찾아야할지 모를 수도 있습니다. 내가 만든 관찰은 '충돌'이 가비지 수집과 일치하는 것 같습니다.Java SE 바이너리 충돌

문제는 재생하기가 쉽고 응용 프로그램 실행 후 약 10 분 후에 발생합니다. 특정 jvm 매개 변수로 응용 프로그램을 실행하지 않습니다. Java 버전은 1.6.0_31 (업그레이드 전 _25)이었고 Windows 7 64 비트에서 실행됩니다.

VisualVM의 아래 그림에서 Java 바이너리가 GC 실행과 동시에 작동하는 것으로 나타났습니다. Dump from Java VisualVM

문제를 해결하거나 해결할 수있는 도움이나 아이디어가 있으면 크게 환영합니다. 감사.

+0

JNI 확장을 사용하고 있습니까? –

+0

GC가 제대로 작동하지 않는 것 같습니다. – kosa

+0

@DmitryOvsyanko No. – hgus1294

답변

2

가비지 수집은 발생하는 동안 VM의 응용 프로그램 스레드를 일시 중지합니다. 이는 경쟁 조건을 어딘가에 노출시킬 수 있습니다.

+0

확인. 그 문제를 어떻게 해결할 수 있을지에 대한 생각은? – hgus1294

+0

EDT 위반과 관련하여 [* ThreadCheckingRepaintManager *] (http://weblogs.java.net/blog/alexfromsun/archive/2006/02/debugging_swing.html)도 참조하십시오. – trashgod

3

세 가지 확인 사항 : 당신이 finalize() 방법 어디서든 구현 한 경우

  1. , 반드시 직접적 또는 간접적으로 물건을 고정하지 않습니다 수 있도록; 이것은 GC와 관련된 교착 상태 교착 상태를 유발할 수 있습니다.

  2. 네이티브 코드가있는 경우 코드가 전역 참조를 올바르게 사용하지 않으면 교착 상태와 이상한 메모리 손상이 발생하여 GC 작업과 다시 관련됩니다.

  3. 마지막으로 GC는 "pot"을 교반하고 응용 프로그램에 존재하는 바닐라 교착 상태를 나타낼 수 있습니다. 동기화 프로토콜을 확인하십시오.

+0

그 메시지입니다 - 바이너리가 작동을 멈췄습니다 - 항상 교착 상태입니까? –

+1

이것은 교착 상태이거나 JVM, Windows 또는 기본 라이브러리의 버그입니다. 그는 2 개의 다른 Java 패치 레벨을 시도 했으므로 JVM 버그가 너무 높지는 않으며 주석 당 기본 코드를 사용하지 않습니다. 따라서 Windows 버그 (즉, JVM에서 사용되는 일부 Windows DLL의 버그) 또는 교착 상태 중 하나입니다. –

+0

감사. 잠재 후보자가 될 수 있으므로 1 + 3으로 확인합니다. 문제가되는로드로 디버그 모드에서 애플리케이션을 실행하기가 번거롭고 어려울 것이기 때문에 어디에서 문제가 발생했는지에 대한 정보를 좀 더 얻을 수 있었으면 좋겠다. – hgus1294

관련 문제