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

8

Kürzlich habe ich eine Swing-Anwendung in Webstart konvertiert. Der Prozess war ziemlich einfach, aber ich fand, dass nach dem Schließen aller Fenster die JVM der Anwendung nicht beendet wurde. Der Thread-Dump zeigte, dass es einige Nicht-Daemon-Threads gibt, insbesondere Swing's EDT, AWT und einige websart-bezogene Threads.

Die tatsächlich verwendete Strategie besteht darin, dass jedes Fenster beim Erstellen einen Zähler inkrementiert und beim Schließen einen Zähler dekrementiert. Der standardmäßige Schließvorgang ist DISPOSE_ON_CLOSE. Wenn der Zähler Null erreicht, höre ich alle Threadpools auf und gebe alle JNI-Ressourcen frei.

Als ich die Anwendung von einer Fledermaus-Datei (gleiche JARs) gestartet habe, endete es gut, als alle Fenster geschlossen wurden, also dachte ich, dass das Problem etwas mit Webstart zu tun hat.

Jetzt die Fragen:

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

Siehe auch Folgefrage zum Erkennen, ob die App von Webstart gestartet wurde.

    
ddimitrov 23.05.2017, 12:12
quelle

5 Antworten

6

Wegen Fehlern in WebStart, ja. WebStart startet einen "sicheren Thread" für seine eigenen Zwecke, der mit dem EDT interagiert. Dieser SecureThread verhindert die automatische Beendigung des Java-Prozesses, den man erwarten würde, wenn alle Windows- und AWT-Ressourcen entsorgt werden.

Weitere Informationen finden Sie unter Ссылка

    
shemnon 17.10.2008, 19:36
quelle
1

Der AWT EDT ist normalerweise der Schuldige. Seit einigen Jahren hat es eine gewisse Logik, um abzuschalten, wenn es keine unangepassten Fenster gibt. Es gibt jedoch immer wieder Probleme mit Lecks, einschließlich der Implementierung von AWT und Swing. Daher empfehle ich dringend, System.exit in Produktionsversionen zu verwenden (möglicherweise möchten Sie es für einige Tests auslassen, um Lecks zu erkennen).

Der WebStart-Thread sollte allesamt Daemon sein, wenn keine Systemfenster (Konsole, javax.jnlp-Dienste und andere Dialoge) angezeigt werden.

    
Tom Hawtin - tackline 17.10.2008 13:22
quelle
0

Webstart startet das Konsolenfenster (Sie können es möglicherweise deaktivieren). Das Konsolenfenster wird verwendet, um stdout / err des Webstart-Prozesses sowie rudimentäres log / debug zu sehen, hat aber als Nebeneffekt ein AWT / Swing-Fenster auf oberster Ebene. Da der AWT / EDT nur endet, wenn das Fenster LAST geschlossen ist, hält das Konsolenfenster Ihre Anwendung aufrecht. Sie sollten wahrscheinlich System.exit () aufrufen, um 100% sicher zu sein, dass Ihre Anwendung beendet wird (es sei denn, Sie können eine bestimmte Client-Konfiguration garantieren, webstart console ausgeschaltet)

    
basszero 17.10.2008 13:09
quelle
0

Ziehen Sie in Betracht, sich mit jconsole zu verbinden und schauen Sie sich an, was die JVM tut.

    
quelle
0

Ich habe das gleiche Problem mit dem Webstart. Wenn ich die Java-Konsole ausschalte, legt der Prozess nicht auf. Irgendeine bekannte Bug-ID von Sun?

    
Loop 03.03.2009 15:27
quelle

Tags und Links