sind Java Primitive Müll gesammelt

Wenn ich einen int (oder einen primitiven Typ) innerhalb einer Methode in Java deklariere, wird dieser Speicher in dem Moment freigegeben, in dem die function 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, der an ihn angehängt ist, wie lokale Variablen).

Wenn diese Variable jedoch ein Objekt ist, ist ihr Wert ein pointers. Der tatsächliche Speicher, der das Objekt enthält (das möglicherweise auch pointers auf andere Objekte hat), würde sich auf dem Heap befinden. Wenn die Referenz auf dem Stapel freigegeben wird, sitzt das Objekt nur herum, ohne dass jemand darauf Bezug nimmt (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 rohen Wert und sind keine pointers. Wie in anderen Antworten angegeben, ist es nicht notwendig, sie zu erfassen.

Dies ist sehr analog zu malloc und free in C.

Wenn Sie Speicher in einer Variablen in C malloc und Ihre function zurückgibt, wird der Speicher für diesen pointers freigegeben, aber nicht der Speicher, auf den es zeigte.

Wenn Sie ein Objekt in Java erstellen (vermutlich mit dem new Schlüsselwort), ordnen Sie ihm Speicher zu. Sie rufen jedoch nie explizit in Java frei. 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.

Primitive werden auf dem Stapel zugewiesen, so dass ihr Speicher in dem Moment freigegeben wird, in dem die function zurückkehrt.

Ist dieser Speicher freigegeben, sobald die function zurückkehrt, oder muss er warten, bis der Garbage Collector ihn bereinigt?

Die in der Methode deklarierten Primitiven 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.