Wie clever ist der Garabage Collector?
-
hallo zusammen.
ich zerbreche mir gerade über folgendes problem den kopf: ich habe eine double linked list, also eine liste, in der jedes element einen zeiger auf seinen nachfolger und seinen vorgänger hat.
wenn ich nun die gesamte liste löschen möchte, setze ich einfach den nachfolgerzeiger des anfangselementes (head, enthält keine daten, vorgänger zeiger zeigt auf sich selbst) auf das endelement (tail, enthält keine daten, nachfolgerzeiger zeigt auf sich selbst.
damit habe ich dann die einträge der liste "abgehängt", das heisst sie sind nicht mehr referenzierbar.
allerdings ist es ja so, dass sich die "abgehängten" objekte untereinander trotzdem noch gegenseitig referenzieren (zeiger auf nachfolger UND vorgänger).meines wissens nach entfernt der garbage collector nur objekte aus dem heap, auf die es gar keine referenz mehr gibt; die abgehängten objekte referenzieren sich aber noch gegenseitig, obwohl nun jedoch überhaupt kein zugriff mehr auf diese kette möglich ist.
ist der garbage collector clever genug zu erkennen, dass die abgehängte kette im nirvana schwebt? oder bleiben die daten bis zum terminieren des prozesses im heap verstreut und verstopfen den speicher? (von einer möglichkeit die allokierung der daten manuell aufzuheben weis ich leider nix in java).
vielleicht weis ja einer bescheid, wie sich das hat
gruß & danke
-
jule37 schrieb:
ist der garbage collector clever genug zu erkennen, dass die abgehängte kette im nirvana schwebt? oder bleiben die daten bis zum terminieren des prozesses im heap verstreut und verstopfen den speicher? (von einer möglichkeit die allokierung der daten manuell aufzuheben weis ich leider nix in java).
vielleicht weis ja einer bescheid, wie sich das hat
Hi.
Der GC ist clever genug.
-
danke für deine schnelle antwort, gregor
schön zu hören, dass das so ist. erspart mir ein paar graue haare.
mal so aus neugierde: weist du, wie der gc vorgeht um das zu merken? weil mir liegt die logik grad nicht auf der hand
danke
-
jule37 schrieb:
mal so aus neugierde: weist du, wie der gc vorgeht um das zu merken? weil mir liegt die logik grad nicht auf der hand
Ich kenne mich da nicht genau aus. Im Netz habe ich auch nicht gute Quellen dazu gefunden, sonst hätte ich schon eine gepostet. Du kannst Dir aber mal das da angucken:
http://www.ibm.com/developerworks/library/j-jtp10283/
Generell gibt es verschiedene Vorgehensweisen bei der Garbagecollection. Insofern kann man da eh keine eindeutige Antwort geben. Über das Thema gibt es ganze Bücher. Zum Beispiel das da:
Garbage collection | ISBN: 0471941484Falls Du ein Stichwort für die Suche im Netz suchst: Ich glaube, Du solltest nach 'cyclic references' oder "circular references" und 'garbage collection' suchen.
Da ist übrigens ein äquivalenter Thread auf der Javaranch. Leider auch sehr kurz, aber wenigstens mit einer kleinen Erläuterung:
http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=34&t=000582
-
Das Zauberwort heißt "Mark and Sweep".
http://www.ibm.com/developerworks/library/j-jtp10283/
-
Der Link kam aber schon.
Es ist auch nützlich, die Sun-Seiten zu durchwühlen, dort ist der GC von A bis Z beschrieben.
-
Ich meine, dass der GC alles löscht was nicht mehr referenziert werden kann !
Sprich sobald du keine Variable mehr auf einen reservierten Speicherbereich zeigen lässt, ist dieser Bereich für dich nciht mehr zugänglich und desweiteren MÜLL ! Aber das heißt nicht, dass das dann auch gelöscht wird ! Es wird fürs Löschen vorgemerkt, und sobald der Speicher knapp wird oder was auch immer, wird dies dann gelöscht !Gruß Chris
-
danke für eure antworten und die links. jetzt hab ich wohl erstmal einiges zu lesen