Hi Leute!
Ich hab jetzt wirklich eine sehr allgemeine Frage. Es geht auch eher um eine Speicher-Frage, aber mich würde die grundsätzliche Arbeitsweise auch mal interessieren.
Es ist doch so, dass der GarbageCollector nur Objekte aufräumt, auf die keine Referenz mehr vorhanden ist, richtig? Angenommen ich lese aus einer Datenbank 1000 Dateinamen aus. Für jeden Dateinamen wird dann ein eigener Thread gestartet, der ein Objekt anlegt, das den Inhalt der Datei holt und irgendwas damit anstellt. Sobald die Verarbeitung fertig ist, sollte aber das Objekt zerstört werden.
Ab wann weiß der GarbageCollector, dass keine Referenz mehr auf ein Objekt vorhanden ist? Zur Verdeutlichung folgender Code:
Theoretisch gibt es doch auch nach Beendigung des Threads noch eine Referenz auf das Objekt? Damit würde dieses Objekt ewig im Speicher liegen. Was passiert, wenn ich am Ende o = null; hinzufüge? Damit müsste die Referenz ja weg sein, aber der Sinn des GarbageCollectors wäre auch weg. Der Vorteil von GC sollte ja sein, dass man sich als Programmierer - anders als bei C++ - nicht um die Speicherfreigabe kümmern muss. Das muss ich doch aber, wenn ich o = null; schreiben muss, um die Referenz auf das Objekt zu zerstören. Oder seh ich das falsch?
Viele Grüße,
Martin
Ich hab jetzt wirklich eine sehr allgemeine Frage. Es geht auch eher um eine Speicher-Frage, aber mich würde die grundsätzliche Arbeitsweise auch mal interessieren.
Es ist doch so, dass der GarbageCollector nur Objekte aufräumt, auf die keine Referenz mehr vorhanden ist, richtig? Angenommen ich lese aus einer Datenbank 1000 Dateinamen aus. Für jeden Dateinamen wird dann ein eigener Thread gestartet, der ein Objekt anlegt, das den Inhalt der Datei holt und irgendwas damit anstellt. Sobald die Verarbeitung fertig ist, sollte aber das Objekt zerstört werden.
Ab wann weiß der GarbageCollector, dass keine Referenz mehr auf ein Objekt vorhanden ist? Zur Verdeutlichung folgender Code:
Code:
Thread t = new Thread( new Runnable() {
public void run() {
Objekt o = new Objekt();
o.machIrgendwas();
}
});
t.start();
Theoretisch gibt es doch auch nach Beendigung des Threads noch eine Referenz auf das Objekt? Damit würde dieses Objekt ewig im Speicher liegen. Was passiert, wenn ich am Ende o = null; hinzufüge? Damit müsste die Referenz ja weg sein, aber der Sinn des GarbageCollectors wäre auch weg. Der Vorteil von GC sollte ja sein, dass man sich als Programmierer - anders als bei C++ - nicht um die Speicherfreigabe kümmern muss. Das muss ich doch aber, wenn ich o = null; schreiben muss, um die Referenz auf das Objekt zu zerstören. Oder seh ich das falsch?
Viele Grüße,
Martin