Exception in der Eventqueue

Moin,

ich bin auf einen recht seltsamen Fehler aufmerksam gemacht worden, der mit unserer Software auf einem bestimmten Rechner (zumindest bis jetzt) auftritt!
Nach geraumer Zeit innerhalb eines Stresstests regiert die Anwendung nicht und die Anzeige friert ein.
In der Java-Konsole kommt dann die Fehlermeldung aus der Anlage.

Von welchen Handles ist denn hier die Rede ??
Ich habe im Web jetzt schon länger gesucht und bin dabei über die GDI-Handels gestolpert, die allerdings lt. Taskmanager im Schnitt unter 100 liegen (bei einem eingestellten Limit von 10000).
Im Taskmanager wurden zu dem Zeitpunkt ca. 540 ‘normale’ Handles angezeigt (initial so um die 500), die sollten es doch wohl auch nicht sein …

Allerdings war der Speicherverbrauch auf ca. 320.000 k angestiegen (von initial ca. 100.000 k).
Gestartet wird es in der JNLP mit ‘initial-heap 64m’ und ‘max-heap 512m’

Hat irgendwer eine Idee, wie man hier weiter vorgehen kann?

Danke und Gruß
Klaus

Moin,

ich lasse nebenbei auch ‘jconsole’ rsp. ‘jvisualvm’ mitlaufen, aber so richtig haben mich die beiden auch nicht weitergebracht.

Habe im Taskmanger gesehen, dass die Einträge in der Spalte “BENUTZER-Objekte” langsam hochlaufen.
Laut der Hilde des Taskmanagers sind BENUTZER-Objekte Objekte aus dem Fenster-Manager, die Fenster, Menüs, Cursor, Symbole, Hooks, Beschleuniger, Monitore, Tastaturlayouts und andere interne Objekte enthalten

Hat jemand eine Idee, wie ich sie identifiziereb kann ??

Danke und Gruß
Klaus

Noch nie gesehen. Noch kurz die Meldung auf Englisch: https://www.google.de/search?q=The+current+process+has+used+all+of+its+system+allowance+of+handles+for+Window+Manager+objects

WAS genau das Programm macht ist nicht so klar. GANZ (GANZ!) wild ins Blaue geraten könnte ich mir vorstellen, dass sowas passieren KÖNNTE, wenn man z.B. viele JFrames oder Dialoge erstellt, die dann mit GUI-Komponenten füllt, und irgendwann unsichtbar macht, aber vergißt, “dispose()” aufzurufen.

[QUOTE=Marco13]Noch nie gesehen. Noch kurz die Meldung auf Englisch: https://www.google.de/search?q=The+current+process+has+used+all+of+its+system+allowance+of+handles+for+Window+Manager+objects

WAS genau das Programm macht ist nicht so klar. GANZ (GANZ!) wild ins Blaue geraten könnte ich mir vorstellen, dass sowas passieren KÖNNTE, wenn man z.B. viele JFrames oder Dialoge erstellt, die dann mit GUI-Komponenten füllt, und irgendwann unsichtbar macht, aber vergißt, “dispose()” aufzurufen.[/QUOTE]
Das Programm zeigt Alarmmeldung von von unseren Geräten an!
Es besteht eigentlich nur aus einen großen JFrame, der in fünf Bereiche unterteilt ist, in denen dann verschiedene JPanel mit den jeweiligen Daten angezeigt werden.
Bei unserem Streßtest haben wir ca. 5000 gleiche Alarme von genau EINEM Gerät auflaufen lassen, also immer der gleiche Bildschirmaufbau mit (fast) gleichen Daten …

Ok, **Dialoge **wäre vielleicht noch eine Idee, da könnte ich nochmal forschen!
Ich weiß, dass einzelne (selbst programmierte) nicht disposed werden, sondern während der gesamten Programmlaufzeit aktiv sind und immer nur sichtbar/unsichtbar geschaltet werden …

Danke und Gruß
Klaus

Wenn wirklich der Fall eintritt, dass “sehr viele” GUI-Komponenten gleichzeitig aktiv sind, könnte das ein nahe liegender Grund sein. Aber der Formulierung nach scheint es ja ein “Leck” zu sein, richtig? (D.h. der Fehler tritt IMMER auf, und IMMER erst nach einer bestimmten Zeit?!)

Die Klassiker: Mal Java-Version und Treiber updaten. Aber das ist natürlich nur Stochern im Trüben…

Moin Marco,

Es sind im wesentlichen mehrere Panel mit Textfelder, ein Panel mit einem Bild und zudem eine Menü- und eine Buttonleiste, in der je nach Zustand (Meldungen anzeigen, abfragen, Leerlauf) unterschiedliche Button angezeigt und enabled oder disabled werden …

Sieht für mich so aus, die Anzahl dieser BENUTZTER-Objekte (und auch der Speicher) langsam, aber kontinuierlich ansteigt.
Der Speicherverbrauch scheint noch nicht wirklich kritisch zu sein. In der JNLPsind MIN=64M und MAX=512M vorgegeben. Der reine Heap steigt lt. jvisualvm von anfangs 40-60 auch auf vlt. 150 M an (über vlt. 3 - 4 Std. Laufzeit), Aber bei den BENUTZER-Objekten scheint ist bei 10000 Schluß! Dies ist ja wohl der Standard-Wert in der Registry. Natürlich könnte ich ihn auch erhöhen, aber das löst natürlich nicht das grundlegende Problem … :frowning:

Ich habe es gestern nachmittag auf hier auf meinen beiden Rechnern ansatzweise nachvollziehen können (Win7 x64 und XP x32) …
Als Java-Version ist bei mir die 8_111 aktiv, bei meinem Chef (auf dem ursprüglichen Rechner) 8_73 mit Win7 x64 !
Würde ich von daher erstmal ausschließen wollen … um die Treiber müsste sich unsere IT kümmern, darauf habe ich keinen Zugriff!

Die Anwendung selbst existiert in dieser Form seit mind. 15 Jahren (mit ständigen Umbauten und Erweiterungen natürlich). Von daher kann/will auch nicht ausschließen, dass dieses Problem schon ewig existiert, nur noch nie bemerkt wurde. Es tritt auch im Wesentlichen auchnur bei diesem Streßtest auf, bei dem Meldungen fast im Sekundentakt angezeigt und automatisiert wieder beendet werden (auch diese Automatik mag Fehler enthalten).

Mein großes Problem ist halt, irgendeinen Ansatz zu finden, WO ich WAS in den Sourcen (immerhin rund 100000 Zeilen, von denen ca. 20 - 40 % relevant sein könnten) eigentlich suchen soll … :sick: :confused:

Gruß Klaus

Hast du mit der VisualVM mal einen Heapdump erstellt und ihn analysiert (bspw. mit MAT)? Gibt es eine Klasse, von der extrem viele Instanzen im Speicher liegen bleiben?

Kenn ich. Zumindest glaube ich das zu kennen. Vom hörensagen. Zu beachten ist das es sich hier nicht um Swing sondern AWT handelt.

Bei einem früheren Job hatte ich es mit SWT und Eclipse RCP zu tun. Und wenn mich nicht alles täuscht werden dort auch die Nativen Komponenten, wie sie auch AWT verwendet genutzt. Die Problematik sollte also weitgehend übertragbar sein.

Naja, und diejenige die die Anwendung schon vor meiner Zeit verbrochen hat, meinte auch dass ihr hin und wieder die Handles ausgegangen sind. Man muss dazusagen, dass hier ERP-Daten komplett eingelesen wurden und auch ausgegeben mit allem Blödsinn (verschiedene Icons und Farben für jeden Artikel in Tabellarischer Form über den gesamten Warenbestand). Dauerte auch immer dementsprechend lange bis das Ding auf Potenter Hardware gestartet ist. Jedenfalls wenn der Kunde zu groß war/wurde gab es Probleme und auf 32-bit eben noch mehr. Es bestand also immer die Angst, dass der Chef dann doch irgendwo einen Weltkonzern an Land ziehen würde.

Naja, der Code sah auch dementsprechend katastrophal aus. Aber eines was immer heraussticht war das Farben, Icons immer als statische Variablen möglichst nur Einmalig angelegt wurden und dann in einem Singleton vorgehalten wurden. Ob es wirklich was gebracht hat, kann ich nicht sagen, hatte aber selbst nicht das Erlebnis das Handles ausgingen.

In der Tutorialatur zu SWT wird, wenn ich mich recht entsinne auch immer eine Spezielle Methode verwendet um Farben zu cachen oder wiederzuverwenden.

https://stackoverflow.com/questions/50064/setting-colors-in-swt Beide Antworten von qualidafial.
https://www.eclipse.org/articles/Article-SWT-Color-Model/swt-color-model.htm

Und dass ist auch der einzige Grund warum man ein Singleton verwenden darf.

Moin Euch beiden,

[QUOTE=ionutbaiu]
was immer heraussticht war das Farben, Icons immer als statische Variablen möglichst nur Einmalig angelegt wurden und dann in einem Singleton vorgehalten wurden

In der Tutorialatur zu SWT wird, wenn ich mich recht entsinne auch immer eine Spezielle Methode verwendet um Farben zu cachen oder wiederzuverwenden.

java - Setting Colors in SWT - Stack Overflow Beide Antworten von qualidafial.
SWT Color Model
Und dass ist auch der einzige Grund warum man ein Singleton verwenden darf.[/QUOTE]
Ok, danke - werde mich da mal einlesen und dann wieder berichten !

nein, da ich MAT bislang nicht kannte.
Muss mich wohl auch da erstmal einlesen!

Danke und Gruß
Klaus

Moment - das ganze bezieht sich doch auf AWT/Swing, oder?
Bei SWT ist das ja was ganz anderes. DA muss man ja jedes einzelne Farb-Objekt mit “dispose” freigeben, weil’s sonst diese Handles an sich reißt.
Meine Vermutung war, dass irgendeine AWT-Komponente “im Speicher bleibt”. Die Verwenden unter der Haube ja auch diese Handles, aber üblicherweise transparent, d.h. man muss NICHT jeden Mist disposen, außer Top-Level-Components wie Dialogen oder Fenstern.

Hallo Marco,

[QUOTE=Marco13]Moment - das ganze bezieht sich doch auf AWT/Swing, oder?
Bei SWT ist das ja was ganz anderes. DA muss man ja jedes einzelne Farb-Objekt mit „dispose“ freigeben, weil’s sonst diese Handles an sich reißt.
Meine Vermutung war, dass irgendeine AWT-Komponente „im Speicher bleibt“. Die Verwenden unter der Haube ja auch diese Handles, aber üblicherweise transparent, d.h. man muss NICHT jeden Mist disposen, außer Top-Level-Components wie Dialogen oder Fenstern.[/QUOTE]
ok, gutes Argument :rolleyes:
Da war ich vielleicht etwas zu voreilig :frowning:
In meinen Sourcen finden sich reichlich Stellen á la „Font font = new Font( display, „Courier“, 10, nn )“, aber in der Tat sind dies dann AWT-Fonts. SWT verwende ich augenscheinlich gar nicht …
Muss da wohl doch nochmal einen Blick auf gewisse Grundlagen werfen :stuck_out_tongue_winking_eye:

Warum wird denn bei AWT kein „font.dispose()“ benötigt? Greift hier dann der GC passend ein ??

Sagt Dir denn dieser „Memory Analyzer (MAT)“ von Eclipse etwas?
Bringt mir der mehr als beispielsweise jvisualvm ??

Danke und Gruß
Klaus

Wie die Abbildung dieser Resourcen auf Windows-Handles bei AWT/Swing läuft, weiß ich nicht genau. Aber der entscheidende Punkt ist: Normalerweise braucht man sich darum nicht zu kümmern. Mit MAT habe ich noch nicht gearbeitet. Nur jVisualVM und erste Tests mit dem “Java Mission Control Flight Recorder”. Letzterer liefert DEUTLICH mehr Infos, aber ob das bei dem konkreten Handle-Problem hilft, ist schwer zu sagen. Die naive Frage muss kommen: Gibt es ein “KSKB”, mit dem man den Fehler reproduzieren kann? Und sei es sowas wie
while (true) { createGui(); disposeGui(); }
?!

Moin,

ok, Danke - den Flight recorde werde ich auch noch suchen und ausprobieren …

[QUOTE=Marco13;144009]
Die naive Frage muss kommen: Gibt es ein „KSKB“, mit dem man den Fehler reproduzieren kann? Und sei es sowas wie while (true) { createGui(); disposeGui(); } ?![/QUOTE]
Leider nein :frowning:
Habe das Ganze bislang nur bei diesem speziellen und leider sehr großen, unübersichtlichen Programm beobachten können.
Das in irgendeiner Form runterzubrechen auf einen einzelnen Funktionsaufruf ist leider nicht möglich, da dann da Ganze nicht mehr funktioniert.
Selbst nur bestimmte Teile ausblenden, funktioniert nicht wirklich, das der Code nicht nur sehr komplex, sondern auch böse ineinander verzahnt ist (leider insgesamt eine Altlast, die sich auch so kaum ändern lässt - außer man würde alles komplett neu desginen und programmieren)

Das einzige, was sich konkret sagen läßt: das tritt wohl nur bei unserem Streßtest auf (Meldungsanzeige im ca. 2-Sekundentakt bei einer automatischen Meldungsverarbeitung).
Wenn man die Meldung (so wie eigentlich vorgesehen) einzeln händisch abarbeitet, steigt die zahl der Objekte zwar leicht an, aber eben lange nicht so gravierend.
In diesem Automatik-Modus (der eben nur zu Testzwecken eingebaut wurde) sind sogar manche Dinge gegenüber der normalen Bearbeitung deaktiviert, umeben die Automatik überhaupt zu gewährleisten.

Im Prinzip wird die gesamte GUI erst durch das Programmende runtergefahren …

Gruß Klaus

Gruß Klaus

Dann stellt sich natürlich die Frage, ob das Problem durch das getestete Programm oder durch das Testprogramm entsteht, oder aus dem Zusammenspiel beider. Vielleicht jagst du einem Phantom nach, aber es ist natürlich nachzuvollziehen, dass du da sichergehen willst.

Kannst du von dem großen, komplizierten Testprogramm nicht (natürlich in einer Kopie) nach und nach alles mögliche weglassen, bis der Fehler nicht mehr auftritt? Vielleicht kannst du das ja so runterbrechen. Ich weiß, das ist vermutlich höllisch aufwändig bei diesen Laufzeiten, aber es könnte ja nach und nach im Hintergrund zu anderen Tätigkeiten erfolgen.

Moin,

[QUOTE=Crian]Dann stellt sich natürlich die Frage, ob das Problem durch das getestete Programm oder durch das Testprogramm entsteht, oder aus dem Zusammenspiel beider. Vielleicht jagst du einem Phantom nach, aber es ist natürlich nachzuvollziehen, dass du da sichergehen willst.
Kannst du von dem großen, komplizierten Testprogramm nicht (natürlich in einer Kopie) nach und nach alles mögliche weglassen, bis der Fehler nicht mehr auftritt? Vielleicht kannst du das ja so runterbrechen. Ich weiß, das ist vermutlich höllisch aufwändig bei diesen Laufzeiten, aber es könnte ja nach und nach im Hintergrund zu anderen Tätigkeiten erfolgen
[/QUOTE]
na ja, ein richtiges Testprogramm habe nicht … wir senden nur durch den Streßtest große Mengen Meldungen ins System, die dort entsprechend aufgebreit und dann von der hier betroffenen Software angezeigt werden. Es ist quasi nur ein Simulator anstelle von richtigen Geräten, die sonst die Meldungen erzeugen.
Daran werden wir leider auch nicht drehen können.

Und die Darstellung ein einer Meldung ist EIN großer, komplexer Vorgang, bei dem ich leider nicht bestimmte Teile rauslassen kann.
Es wird dabei eine DB-Abfrage an ein C+±Serverprogramm gesendet, welches dann das Melödungspaklet generiert und zurücksendet.
Dann wird dieses Datenpaket (meist zwischen 6000 und 10000 Byte) auseinander gedröselt und dargestellt.
Dazu kommen dann je nach nach Meldungsart noch verschiedene andere Aktionen, bspw. das Laden verschiedener Bilder (teils von der HD, teils auch über einen FTP-Server), die dann mit angezeigt werden …

Mein Problem ist ja eigentlich auch, nicht zu wissen, wonach ich suche … :sick:
Ich sehe nur das pro Alarm etwas 20 User-Objekte hinzukommen und nach Abschluß der Anzeige etwa 8 - 10 verbleiben (lt. Taskmanager). Somit steigt die Zahl relativ kontinuierlich an und bei rund 10000 ist dann Schluß und es kommt der Fehler!

Gruß Klaus

Dann noch einmal mein Tipp: beschäftige dich mit dem MAT. Wenn zu den Systemobjekten auch Java-Objekte gehören (wovon ich ausgehe, sonst wäre das wohl ein Bug in der JVM), dann kannst du das Leck damit finden.
Mit dem MAT kann man die „Wurzel“ des Memory-Leak finden - also die Instanz, die noch Referenzen auf nicht freigegebene aber sonst ungenutzte Instanzen hält. Wenn das Problem erst einmal auf die verursachende Klasse eingeschränkt ist, findet man die Ursache normalerweise relativ zügig.

Moin,

[QUOTE=cmrudolph]Dann noch einmal mein Tipp: beschäftige dich mit dem MAT. Wenn zu den Systemobjekten auch Java-Objekte gehören (wovon ich ausgehe, sonst wäre das wohl ein Bug in der JVM), dann kannst du das Leck damit finden.
Mit dem MAT kann man die „Wurzel“ des Memory-Leak finden - also die Instanz, die noch Referenzen auf nicht freigegebene aber sonst ungenutzte Instanzen hält. Wenn das Problem erst einmal auf die verursachende Klasse eingeschränkt ist, findet man die Ursache normalerweise relativ zügig.[/QUOTE]
hmm, hatte ich gestern Nachmittag und heute morgen gemacht, habe aber außer Speicherverbräuchen eigentlich nicht viel gesehen :frowning:
Das es sich auf eine bestimmte Klasse runterbrechen läßt, glaube ich fast nicht, da das ganze nicht sonderlich OOP ist :-((

Hinzu kommt, dass ich die Standalone-Version nicht ans löaufen bekommen habe!
Werde mich damit aber nochmal befassen …

Danke und Gruß
Klaus

*** Edit ***

So, ich habe das Programm zwar jetzt ans laufen bekommen … kann aber mit den Ausgaben rein gar nicht anfangen :frowning:

Ein Haufen Tortendiagramme und man kann sich lustig durch die Pfade von Systemkomponenten klicken, aber dann ???

Der Leak Suspects Report zeigt mir zwar drei mögliche Probleme an (mit int[] und char[]), aber wenn ich mit „Details“ weiterklickt, sehe ich alles mögliche, nur keinen Verweis auf meinen eigenen Sourcen :confused:

**>> Mit dem MAT kann man die „Wurzel“ des Memory-Leak finden - also die Instanz, die noch Referenzen auf nicht freigegebene aber sonst ungenutzte Instanzen hält. Wenn das Problem erst einmal auf die verursachende Klasse eingeschränkt ist, findet man die Ursache normalerweise relativ zügig.
**
Ich sehe ja nicht mal ein Leak, geschweige denn die Wurzel … irgendwie verstehe ich es nicht :frowning:

Interessanterweise hatte vor 20 Stunden jemand das gleiche Problem: multithreading - Java internal error: Exception in thread “AWT-EventQueue-0” - Stack Overflow

Die verlinkte Antwort deutet darauf hin, dass dort irgendwas “falsch programmiert” ist, aber “DIE” Ursache im konkreten Fall zu benennen ist schwerig. Leider kann ich darum nicht konkreter weiterhelfen. (Ein kurzer Blick in den OpenJDK-Source von WToolkit hat auch keine offensichtlichen Ursachen erkennen lassen, aber das war wirklich nur ein kurzer Blick…)

Moin Marco,

[QUOTE=Marco13]Interessanterweise hatte vor 20 Stunden jemand das gleiche Problem: multithreading - Java internal error: Exception in thread „AWT-EventQueue-0“ - Stack Overflow
[/QUOTE]
Schön, dass ich nicht alleine bin … :o)

[QUOTE=Marco13;144043]
Die verlinkte Antwort deutet darauf hin, dass dort irgendwas „falsch programmiert“ ist, aber „DIE“ Ursache im konkreten Fall zu benennen ist schwerig. Leider kann ich darum nicht konkreter weiterhelfen. (Ein kurzer Blick in den OpenJDK-Source von WToolkit hat auch keine offensichtlichen Ursachen erkennen lassen, aber das war wirklich nur ein kurzer Blick…)[/QUOTE]
Spannenderweise ist dessen Fehlermeldung ja um eine Zeile länger (at java.lang.Thread.run(Thread.java:745)), so dass er eine Referenz auf seine Sourcen hat. Leider fehlt dies bei mir :frowning:

Habe jetzt zwar jetzt einige Angaben mit MAT rauskitzeln können (bspw. „duplicate strings“)

wobei mir der zweite und fünfte Eintrag so nichts sagt.

Bei 1 und 4 handelt es sich um die zusammengefrickelte Titelzeile der Anwendung. Da muss ich mal prüfen, wieso sie so häufig vorliegt!

Die dritte Zeile zeigt einen Teil des vom C+±Server generierten und übermittelten Datenpaket (ist ein großes Byte-Array sind meist zwischen 6000 und 10000 Byte). Da nun im Streßtest immer nur das gleiche Gerät simuliert werden kann, habe ich derzeit und gefähr noch 1500 Meldungendes gleichen Gerätes in der Pipeline. Ich müsste dochmal über alle Strings schauen, ob sie sauber freigegeben werden …

Gruß Klaus

xkcd: Wisdom of the Ancients :wink:

Aber mal ganz allgemein: Du suchst anscheinend nach einem „Speicherleck“, und scheinst dich zu fragen, wo irgendwelche char[] und int[] arrays herkommen.

Ich lehne mich damit zwar weit aus dem Fenster, postuliere aber mal: Das hat mit dem Problem nichts zu tun (*)

Das Problem sind ja offenbar irgendwelche Handles. Und diese Handles werden „von AWT/Swing“ erstellt, um (vage) „irgendwelche UI-Objekte“ abzubilden. Also, du könntest 10 Millionen char[]-Arrays erzeugen, aber das hätte keinen Einfluss auf die Handles.

Ich habe mal dieses Testprogramm erstellt.

ACHTUNG: Begleitenden Text lesen!!!
[spoiler]

Das Programm erstellt dumm-dreist (oder, in schönerer Formulierung: „Automatisiert“ :stuck_out_tongue_winking_eye: ) etliche Dialog-Instanzen die mit etlichen Labels gefüllt sind (mit JDialog würde es auch gehen, aber langsamer).

Das stellt Windows ggf. auf eine harte Probe. Die Taskleiste läuft irgendwann über. Das ist nicht „schlimm“, aber … sicherheitshalber sollte man mal lieber keine anderen, „wichtigen“ Anwendungen offen haben

Im Taskmanager kann man sich ansehen, wie die Anzahl der „Benutzerobjekte“ schneller hochgeht, als ein Lämmchen mit dem Schwanz wedelt.

Und wenn die 10000 erreicht sind, kommt:


Exception in thread "AWT-EventQueue-0" java.lang.InternalError: Der aktuelle Prozess verwendet alle Handles der zulässigen Höchstanzahl für Window Managerobjekte.
	at sun.awt.windows.WToolkit.eventLoop(Native Method)
	at sun.awt.windows.WToolkit.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

package bytewelt;

import java.awt.Dialog;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Window;

import javax.swing.SwingUtilities;

public class HandleLeakTest
{
    public static void main(String[] args) throws InterruptedException
    {
        int i = 0;
        while (true)
        {
            int n = i;
            System.out.println(i);
            SwingUtilities.invokeLater(new Runnable()
            {
                @Override
                public void run()
                {
                    spawn(n);
                }
            });
            i++;
            if (i % 1000 == 0)
            {
                Thread.sleep(10000);
            }
        }
    }
    
    private static void spawn(int i)
    {
        Dialog d = new Dialog((Window)null);
        d.setLayout(new GridLayout(10,10));
        for (int j=0; j<100; j++)
        {
            d.add(new Label(String.valueOf(i)));
        }
        d.pack();
        int x = i % 1000;
        int y = i / 1000;
        d.setLocation(x, y);
        d.setVisible(true);
    }
}

[/spoiler]

Und das legt zumindest die Vermutung nahe, dass dort irgendwas nicht richtig aufgeräumt wird. Genauer zu analysieren, WER denn diese Handles an sich reißt, kann natürlich schwierig sein - es ist wohl nicht so offensichtlich wie in dem Beispiel, wo man sagen kann: Der Dialog!!!

(*) Deswegen das Sternchen neben der Aussage „Das hat mit dem Problem nichts zu tun“: Die Suche nach einem „Speicherleck“ sollte sich bestenfalls auf die Klassen konzentieren, die solche „Handles“ verwenden. Leider kann ich nicht mit Bestimmtheit sagen, welche das sind. Irgendwelche GUI-Komponenten - klar. Aber welche noch? Im schlimmsten Fall gibt es gar kein „Leck“ in diesem Sinne: Es KÖNNTE (nur ZUM BEISPIEL!) sein, dass das freigeben der Handles irgendwie mit dem „finalize()“-Aufruf einzelner Klassen verbunden ist. Und wenn der GC keinen Grund hat, die wegzuräumen, KÖNNTEN sie am Leben bleiben und Handles blockieren. (Im allerschlimmsten (oder allerbesten?) Fall ist es auch ein Bug in Swing/AWT, aber … alles hier ist recht spekulativ, deswegen kann man das erstmal nicht „annehmen“…)