Muss ich in einer Webstart-Anwendung explizit System.exit () aufrufen?

Kürzlich habe ich eine Swing-Anwendung auf Webstart umgestellt. Der Vorgang war ziemlich einfach, aber ich stellte fest, dass die JVM meiner Anwendung nicht beendet wurde, nachdem ich alle Fenster geschlossen hatte. Der Thread-Dump zeigte, dass es einige Nicht-Daemon-Threads gibt, insbesondere Swings EDT, AWT und einige mit Websart verwandte Threads.

Die tatsächlich verwendete Strategie besteht darin, dass jedes Fenster einen Zähler erhöht, wenn es erstellt wird, und einen verringert, wenn es geschlossen wird. Die Standardschließoperation ist DISPOSE_ON_CLOSE. Wenn der Zähler Null erreicht, halte ich alle Threadpools an und gebe alle JNI-Ressourcen frei.

Als ich die Anwendung über eine bat-Datei (dieselben JARs) startete, wurde sie ordnungsgemäß beendet, als alle Fenster geschlossen wurden. Daher stellte ich fest, dass das Problem etwas mit Webstart zu tun hat.

Nun die Fragen:

Kann mir jemand sagen, was genau passiert? Warum verlässt Webstart Zombie-JVMs?Gibt es eine Möglichkeit, die Webstart-Ressourcen explizit freizugeben, ohne die JVM anzuhalten?Ich war immer der Meinung, dass das Aufrufen von System.exit () die schlampige Praxis fördert, Ihre Ressourcen nicht freizugeben und sich darauf zu verlassen, dass das Betriebssystem nach Ihnen bereinigt (was zu bösen Überraschungen führen kann, wenn Sie den Code später wiederverwenden) ... Vermisse ich etwas?

Siehe auch dieZusatzfrage um festzustellen, ob die App von Webstart gestartet wurde.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage