Czy muszę jawnie wywołać System.exit () w aplikacji Webstart?
Ostatnio przekonwertowałem aplikację Swing na Webstart. Proces był całkiem prosty, ale odkryłem, że po zamknięciu wszystkich okien maszyna JVM mojej aplikacji nie została zakończona. Zrzut wątku pokazał, że istnieje kilka wątków innych niż demony, zwłaszcza Swing's EDT, AWT i kilka wątków związanych z websartem.
Rzeczywista strategia polega na tym, że każde okno zwiększa licznik, gdy jest tworzony, i zmniejsza go, gdy jest zamknięte. Domyślną operacją zamykania jest DISPOSE_ON_CLOSE. Wen licznik osiąga zero, zatrzymuję wszystkie pule wątków i wypuszczam wszystkie zasoby JNI.
Kiedy uruchomiłem aplikację z pliku bat (te same pliki JAR), zakończyła się dobrze, gdy wszystkie okna były zamknięte, więc pomyślałem, że problem ma coś wspólnego z Webstartem.
Teraz pytania:
Czy ktoś może mi powiedzieć, co dokładnie się dzieje? Dlaczego Webstart opuszcza maszyny JVM zombie?Czy istnieje sposób jawnego zwolnienia zasobów Webstart bez zatrzymywania maszyny JVM?Zawsze uważałem, że wywołanie System.exit () zachęca do niechlujnej praktyki nie zwalniania zasobów i polegania na systemie operacyjnym po tobie (co może prowadzić do nieprzyjemnych niespodzianek, jeśli użyjesz kodu później) ... czy czegoś mi brakuje?Zobacz takżepytanie uzupełniające do wykrywania, czy aplikacja została uruchomiona przez Webstart.