# Garbage collector



## Urs (18. Jul 2005)

Hallo
Wenn ich mit der Methode freeMemory() mein Memory ansehen, wird der Speicher immer weniger, bis dann irgend wann mal der GC gestartet wird. Nun meine Frage: Muss man den Garbage Collector (GC) selber ausführen oder wird das in jedem Fall vom JM gemacht? Ist es besser wenn man die Methode gc() manuell aufruft? Wenn nicht, für was ist die Methode gc() nötig?
danke Urs


----------



## L-ectron-X (18. Jul 2005)

Die JVM kümmert sich alleine um die Entsorgung nicht mehr referenzierter Objekte aus dem Heap.
Die statische Methode gc() aus System kann explizit aufgerufen werden, um die Garbage Collection anzufordern.
Ich habe von Situationen gehört, in denen dies aus Performance-Gründen gemacht wurde, um eine Operation, in der viele Objekte angelegt wurden abzuschließen.


----------



## Beni (18. Jul 2005)

Der GarbageCollector ruft sich automatisch auf.

System.gc ist für die wenigen Fälle da, wo man wirklich keinen Unterbruch möchte, nur weil der GC ein paar Millisekunden benötigt.

Du musst dich nicht darum kümmern. Das einzige wofür du sorgen musst, ist, dass du ab und zu Referenzen wieder auf null setzt, Listeners entfernst, ... , damit die Objekte dahinter überhaupt vom GC abgeräumt werden können.


----------



## Sky (18. Jul 2005)

Außerdem ist es auch so, dass System#gc nicht zwingend dazu führt, dass der GC sofort aufgerufen wird.


----------



## perdian (18. Jul 2005)

sky80 hat gesagt.:
			
		

> Außerdem ist es auch so, dass System#gc nicht zwingend dazu führt, dass der GC sofort aufgerufen wird.


Es ist sogar noch schlimmer  Es kann sogar sein, dass die Virtual Machine den Aufruf komplett ignoriert, denn man kann der VM nur die "Bitte" senden, dochmal einen GC Lauf zu starten - auf sich darauf verlassen kann man nicht.


----------



## meez (18. Jul 2005)

perdian hat gesagt.:
			
		

> Es ist sogar noch schlimmer  Es kann sogar sein, dass die Virtual Machine den Aufruf komplett ignoriert, denn man kann der VM nur die "Bitte" senden, dochmal einen GC Lauf zu starten - auf sich darauf verlassen kann man nicht.



Ich denke nicht dass die VM den Aufruf komplett ignoriert...Er wird einfach ausgeführt, wenn die VM dazu Zeit und Bock hat...Wann das ist, kann man jedoch nicht sagen...


btw. Runtime.getRuntime().gc(); ist noch ein wenig schneller, da man eine Methode weniger aufrufen muss


----------



## perdian (18. Jul 2005)

meez hat gesagt.:
			
		

> Ich denke nicht dass die VM den Aufruf komplett ignoriert...


Wenn es eine vernünftige Implementierung ist, dann sollte sie das nicht tun 

Aber laut Doku:


			
				Java API 5.0 hat gesagt.:
			
		

> _Calling the gc method *suggests* that the Java Virtual Machine expend effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse._


Von müssen ist da keine Rede.


----------



## meez (18. Jul 2005)

Das heisst wohl eher, dass er ihn wohl irgendwann ausführen wird, aber nicht sicher ist, dass auch etwas dabei gelöscht wird...


----------



## sisko78 (18. Jul 2005)

Hab ich neulich gelesen und fand ich ganz interessant
http://www.galileocomputing.de/openbook/java2/kap_05.htm#Xxx944000


----------

