Frage

Vor kurzem umgewandelt ich eine Swing-Anwendung auf Webstart. Der Prozess war ziemlich einfach, aber ich fand, dass, nachdem ich alle Fenster schließen, JVM meiner Anwendung nicht beenden. Der Thread-Dump zeigte, dass es ein paar Nicht-Daemon-Threads ist, insbesondere Swing EDT, AWT und ein paar websart verwandten Themen.

Die tatsächliche verwendete Strategie besteht darin, dass jedes Fenster einen Zähler erhöht, wenn es erstellt wird und dekrementiert einen, wenn es geschlossen ist. Der Standard-Schließvorgang ist DISPOSE_ON_CLOSE. Wen der Zähler Null erreicht, höre ich auf alle threadpools und lassen Sie alle JNI Ressourcen.

Wenn ich die Anwendung von einer Fledermaus-Datei (gleiche JAR-Dateien) ins Leben gerufen, es beendete gut, wenn alle Fenster geschlossen waren, so dass ich dachte, dass das Problem etwas mit Webstart zu tun hat.

Nun die Fragen:

  1. Kann mir jemand sagen, was genau passiert? Warum Webstart Zombie JVMs verlassen?
  2. Gibt es eine Möglichkeit, die Webstart Ressourcen explizit freigeben, ohne die JVM zu stoppen?
  3. Ich hatte schon immer die Meinung, dass System.exit () aufgerufen wird ermutigt, die nachlässige Praxis nicht Ihre Ressourcen freigegeben werden und auf dem O verlassen, nachdem Sie zu bereinigen (was zu bösen Überraschungen führen kann, wenn Sie den Code später wiederverwenden) ... bin ich etwas fehlt?

Siehe auch die

Andere Tipps

Die AWT EDT ist in der Regel der Schuldige. Seit einigen Jahren hat es eine gewisse Logik zum Herunterfahren hat, wenn es keine undisposed Fenster sind. Allerdings gibt es immer wieder Probleme mit Lecks, auch in der Umsetzung von AWT und Swing. Daher empfehle ich System.exit in Produktions-Releases mit (könnten Sie vielleicht, es verlassen wollen, für einige Tests aus Lecks zu erkennen).

Der WebStart Thread alle Daemon sein sollte, wenn es keine Systemfenster (Konsole, javax.jnlp Dienste und andere Dialoge) sind zeigt.

Webstart startet das Konsolenfenster (Sie können in der Lage sein, das deaktivieren). Das Konsolenfenster wird verwendet, um stdout / err des webstart Prozesses sowie rudimentäre lügt / debug hat aber den Nebeneffekt, erstellt ein Top-Level-AWT / Swing-Fenster. Da die AWT / EDT endet erst, wenn das letzte Fenster angeordnet ist, wird das Konsolenfenster der Anwendung halten. Sie sollten wahrscheinlich System.exit () -Aufruf 100% sicher, dass Ihre Anwendung beendet sein (es sei denn, Sie eine bestimmte Client-Konfiguration können gurantee, webstart Konsole ausgeschaltet)

Betrachten mit jconsole Anbringen und einen Blick auf, was die JVM tut.

Ich erlebe das gleiche Problem mit Web Start. Wenn ich Java-Konsole zu deaktivieren, wird der Prozess nicht aufzuhängen. Alle bekannten Fehler id von Sun?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top