Wenn ich einen int (oder einen primitiven Typ) innerhalb einer Methode in Java deklariere, wird dieser Speicher in dem Moment freigegeben, in dem die Funktion zurückkehrt, oder muss er warten, bis der Garbage Collector ihn bereinigt?
Ich weiß, dass in C der Stapelzeiger zurückgesetzt wird und sofort Speicher freigibt, und ich weiß, dass Objekte in Java Müll gesammelt werden müssen, aber ich weiß nicht, welcher Ansatz mit Primitiven genommen werden würde.
Wenn eine Methode zurückgegeben wird, werden die Variablen auf ihrem Stack immer sofort freigegeben. (Natürlich bedeutet "Freigegeben", dass der Stack-Frame zerstört wird, und der gesamte Speicher wie lokale Variablen).
Wenn diese Variable jedoch ein Objekt ist, ist ihr Wert ein Zeiger. Der tatsächliche Speicher, der das Objekt enthält (das möglicherweise auch Zeiger auf andere Objekte hat), würde sich auf dem Heap befinden. Wenn der Verweis auf dem Stapel freigegeben wird, sitzt das Objekt nur herum, ohne dass jemand darauf verweist (es sei denn, Sie haben eine Referenz irgendwo anders platziert). Das ist, wenn Java hereinkommt und Müll sammelt. Das heißt, das Objekt wird zum Sammeln markiert, und beim nächsten Ausführen des Kollektors wird dieses Objekt bereinigt.
Primitive haben einen Rohwert und sind keine Zeiger. Wie in anderen Antworten angegeben, ist es nicht notwendig, sie zu GC zu machen.
Dies ist sehr ähnlich zu malloc
und free
in C.
Wenn Sie etwas Speicher in eine Variable in C malloc und Ihre Funktion zurückgibt, wird der Speicher für diesen Zeiger freigegeben, aber nicht der Speicher, auf den es zeigte.
Wenn Sie ein Objekt in Java erstellen (vermutlich mit dem Schlüsselwort new
), reservieren Sie dafür Speicher. Sie rufen jedoch nie free
in Java explizit auf. Die JVM erkennt, wann die Freigabe durchgeführt werden muss.
Sie können Verweise auf null setzen, um der JVM mitzuteilen, dass Sie sie nicht mehr benötigen, aber es ist oft besser, nur den minimalen Bereich zu verwenden.
ist dieser Speicher in dem Moment freigegeben, in dem die Funktion zurückkehrt, oder muss er warten, bis der Garbage Collector ihn bereinigt?
Die in der Methode deklarierten Grundelemente werden im Stapelrahmen dieser Methode gespeichert. Da der Stapelrahmen zerstört wird, sobald die Methode zurückkehrt, wird der den lokalen Variablen zugewiesene Speicherplatz freigegeben.
Tags und Links java garbage-collection