WebStart 응용 프로그램에서 System.exit ()를 명시 적으로 호출해야합니까?

StackOverflow https://stackoverflow.com/questions/212009

  •  03-07-2019
  •  | 
  •  

문제

최근에 스윙 애플리케이션을 WebStart로 변환했습니다. 프로세스는 매우 간단했지만 모든 Windows를 닫은 후 응용 프로그램의 JVM이 종료되지 않았다는 것을 알았습니다. 스레드 덤프는 스윙의 EDT, AWT 및 몇 개의 웹 사이트 관련 스레드, 특히 비 데몬 스레드가 있음을 보여주었습니다.

실제 전략은 각 창이 생성 될 때 카운터를 증가 시킨다는 것입니다. 기본 닫기 작업은 dispose_on_close입니다. 카운터가 0에 도달하고 모든 ThreadPools를 중지하고 모든 JNI 리소스를 해제합니다.

BAT 파일 (동일한 항아리)에서 응용 프로그램을 시작했을 때 모든 창이 닫히면 정상이 종료되었으므로 문제가 WebStart와 관련이 있다고 생각했습니다.

이제 질문 :

  1. 누구든지 정확히 무슨 일이 일어나고 있는지 말해 줄 수 있습니까? WebStart가 좀비 JVM을 떠나는 이유는 무엇입니까?
  2. JVM을 중단하지 않고 WebStart 리소스를 명시 적으로 릴리스하는 방법이 있습니까?
  3. 나는 Calling System.exit ()를 Calling System.exit ()에 대한 견해를 가졌다는 의견을 가지고 있었다. 자원을 공개하지 않고 OS에 의존하여 당신이 당신을 따라 청소하기 위해 OS에 의존하는 조잡한 연습을 장려한다는 것은 (나중에 코드를 재사용하면 불쾌한 놀라움을 초래할 수 있음) ... 내가 뭔가를 놓치고 있습니까?

참조 후속 질문 WebStart가 앱을 시작했는지 여부를 감지합니다.

도움이 되었습니까?

해결책

WebStart의 버그 때문에 예. WebStart는 EDT와 상호 작용하는 자체 목적으로 "보안 스레드"를 시작합니다. 이 SecurEthread는 모든 Windows 및 AWT 리소스가 폐기 될 때 예상되는 Java 프로세스의 자동 종료를 방지합니다.

자세한 내용은 참조하십시오 http://www.pushing-pixels.org/?p=232

다른 팁

AWT EDT는 일반적으로 범인입니다. 몇 년 동안 지금은 분해되지 않은 창이 없을 때 종료되는 논리가있었습니다. 그러나 AWT 및 스윙의 구현 내에서 누출에 반복되는 문제가 있습니다. 따라서 생산 릴리스에서 System.Exit 사용을 강력히 제안합니다 (누출을 감지하기 위해 일부 테스트를 위해 남겨 두는 것이 가능할 수 있음).

WebStart 스레드는 시스템 Windows (Console, Javax.JNLP 서비스 및 기타 대화 상자)가 없을 때 모두 데몬이어야합니다.

WebStart는 콘솔 창을 시작합니다 (이를 비활성화 할 수 있음). 콘솔 윈도우는 기초 로그/디버그뿐만 아니라 WebStart 프로세스의 STDOUT/ERR을 볼 때 사용되지만 최상위 AWT/스윙 창의 부작용이 있습니다. AWT/EDT는 마지막 창이 배치 될 때만 종료되므로 콘솔 창이 응용 프로그램을 유지합니다. 아마도 System.exit ()를 호출하여 응용 프로그램 종료를 100% 확신해야 할 것입니다 (특정 클라이언트 구성을 gurantee 할 수 없다면 WebStart Console을 끄려면)

JCONSOLE에 부착하는 것을 고려하고 JVM이 무엇을하고 있는지 살펴보십시오.

웹 시작과 같은 문제가 발생합니다. Java 콘솔을 끄면 프로세스가 끊지 않습니다. Sun의 알려진 버그 ID가 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top