PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Objekte löschen in Java


ethrandil
2003-01-26, 14:32:38
Hallo,
ich habe ein kleines Programm in Java geschrieben. Für grafische Ausgabe verwende ich Swing.
Nun habe ich folgendes Problem: wenn ich ein Fenster beende, (ein unterbenster) dann wird der Speicher nicht freigegeben! (System.gc() bringts nicht).

Wie kann ich sicherstellen, dass ALLE Referenzen auf ein Objekt (und die Unteropbjekte) gelöscht werden?

Eth

Abe Ghiran
2003-01-26, 15:55:56
Hallo!

Versuch es mal mit einem expliziten Aufruf von "MeinFrame / window".dispose(), das sollte eigentlich alle Resourcen des Fensters und dessen Kinder freigeben.

Ansonsten wären einige zusätzliche Angaben ganz hilfreich: welchen Speicher willst du freigegeben? von den gui komponenten oder eigenen objekten? und wie überprüfst du das mit dem Speicherverbrauch?

Es gab auch mal in Verbindung mit Swing ein Speicherleck in einem älterem jdk (1.2?) aber ich denke du arbeitest ja wohl mit 1.4, da sollte dieses Problem ja auszuschließen sein.

Zu den Referenzen: da hilft wohl nur gut aufpassen, von wo aus man ein Objekt referenziert, um dann alle Referenzen zu löschen.

Grüße, Jan

ethrandil
2003-01-26, 16:13:42
Den Speicher überprüfe ich (jaja billig ...) mit dem (Win2k) taskmanager. Das ist zwar nicht perfekt, allerdings steigt der Speicherverbrauch ja, wenn ich das fenster schließe und wieder öffne ;)

Zu den Komponenten: Ich habe da einen Timer dabei, der auf eine Component zeigt ... Kann es daran liegen? wie werde ich den los?

Abe Ghiran
2003-01-27, 00:15:38
Der Timer könnte das Problem sein, laut Doku sollte der sich aber einfach mit cancel() beenden lassen, hast du das mal probiert? In der Doku steht dazu nämlich:


After the last live reference to a Timer object goes away and all outstanding tasks have completed execution, the timer's task execution thread terminates gracefully (and becomes subject to garbage collection). However, this can take arbitrarily long to occur. By default, the task execution thread does not run as a daemon thread, so it is capable of keeping an application from terminating. If a caller wants to terminate a timer's task execution thread rapidly, the caller should invoke the the timer's cancel method.


Ach so, das bezieht sich jetzt auf den swing Timer, es gibt wohl auch noch einen in java.util. Ich habe beide noch nie benutzt, wenn ich solche Probleme habe leite ich immer eben eine innere Klasse aus Thread ab und programmiere das zu Fuß, dann hat man auch die volle Kontrolle darüber. Was machst du denn mit dem Timer?

Jan