Java Garbage Collection mit oder ohne Reference Counter?
-
Hallo,
die Java VM besitzt einen Garbage Collector, der afaik periodisch losgeht und ungülltige Objekte (lassen wir mal Hotspot und den anderen Spaß zur Optimierung außen vor) löscht.
Dazu habe ich eine Frage. Weisen die gängigen Java VM Implementierungen jedem Objekt einen internen Reference Counter zu oder wie erkennt Java, dass ein Objekt überhaupt ungültig ist und gelöscht werden soll?
Einfach irgendein internes Flag im Objekt auf ungültig setzten nachdem es den Scope verlassen hat scheint IMO ein wenig zu einfach zu sein.//Lustiger java-Code { foo bar=new foo(); //Kopiere bar in eine Variable in einen anderen Scope, erstelle einen Thread mit bar als Startparameter, was auch immer... } //Was geschieht nun hier mit der foo-Instanz? //weitere lustige Java-Code
Vielen Dank
-
Weisen die gängigen Java VM Implementierungen jedem Objekt einen internen Reference Counter zu (...)?
Nö.
oder wie erkennt Java, dass ein Objekt überhaupt ungültig ist und gelöscht werden soll?
Indem die Java VM weiss welche Speicherstellen Referenzen auf Objekte sind, und welche nicht, kann sie einfach nachgucken, auf welche Objekte es noch Referenzen gibt.
Dabei kann man z.B. bei den sogenannten "GC roots" anfangen, und sich von dort aus weiter vorarbeiten. D.h. man schnappt sich alle GC roots, und markiert die als "in Verwendung". Dann geht man alle Member dieser Objekte durch, und markiert Objekte auf die so ein Member zeigt als "in Verwendung". Und immer so weiter, bis man "fertig" ist (=im letzten Durchlauf keine neuen Objekte mehr markiert hat).
Eine "GC root" ist dabei z.B. alles was global ist ("statisch"), oder auch alle lokalen Variablen von Funktionen die gerade ausgeführt werden (inklusive Parameter).
Dadurch kann man ermitteln welche Objekte noch über irgendeine Referenz erreichbar sind, und welche nicht.
Reference-Counting würde nicht funktionieren, da man bei Reference-Counting ein Problem mit zyklischen Strukturen bekommt: bei denen würde der Reference-Count nämlich nie auf 0 gehen, und sie könnten nie collected werden.
p.S.: hier kannste nachlesen:
http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)
http://www.brpreiss.com/books/opus5/html/page424.html