Hier ist ein etwas anderes Beispiel, eines mit Feldern vom endgültigen Referenztyp anstelle von lokalen Variablen vom endgültigen Werttyp:
public class MyClass {
public final MyOtherObject obj;
}
Jedes Mal, wenn Sie eine Instanz von MyClass erstellen, erstellen Sie einen ausgehenden Verweis auf eine MyOtherObject-Instanz, und der GC muss diesem Link folgen, um nach Live-Objekten zu suchen.
Die JVM verwendet einen Mark-Sweep-GC-Algorithmus, der alle Live-Referenzen an den GC- "Root" -Standorten untersuchen muss (wie alle Objekte im aktuellen Aufrufstapel). Jedes lebende Objekt wird als lebendig "markiert", und jedes Objekt, auf das sich ein lebendes Objekt bezieht, wird ebenfalls als lebendig markiert.
Nach Abschluss der Markierungsphase durchläuft der GC den Heap und gibt Speicher für alle nicht markierten Objekte frei (und komprimiert den Speicher für die verbleibenden Live-Objekte).
Es ist auch wichtig zu erkennen, dass der Java-Heapspeicher in eine "junge Generation" und eine "alte Generation" unterteilt ist. Alle Objekte werden zunächst in der jungen Generation zugeordnet (manchmal auch als "Kindergarten" bezeichnet). Da die meisten Objekte nur von kurzer Dauer sind, ist der GC aggressiver, wenn es darum geht, den jüngsten Müll von der jungen Generation zu befreien. Wenn ein Objekt einen Sammlungszyklus der jungen Generation überlebt, wird es in die alte Generation (manchmal als "Tenured Generation" bezeichnet) verschoben, die weniger häufig verarbeitet wird.
Ich werde also auf den ersten Blick sagen: "Nein, der 'letzte' Modifikator hilft dem GC nicht, seine Arbeitsbelastung zu reduzieren."
Meiner Meinung nach besteht die beste Strategie zur Optimierung Ihrer Speicherverwaltung in Java darin, falsche Referenzen so schnell wie möglich zu beseitigen. Sie können dies tun, indem Sie einer Objektreferenz "null" zuweisen, sobald Sie damit fertig sind.
Oder, noch besser, minimieren Sie die Größe jedes Deklarationsbereichs. Wenn Sie beispielsweise ein Objekt am Anfang einer 1000-Zeilen-Methode deklarieren und das Objekt bis zum Ende des Bereichs dieser Methode (der letzten schließenden geschweiften Klammer) am Leben bleibt, bleibt das Objekt möglicherweise viel länger am Leben als tatsächlich notwendig.
Wenn Sie kleine Methoden mit nur etwa einem Dutzend Codezeilen verwenden, fallen die in dieser Methode deklarierten Objekte schneller aus dem Geltungsbereich und der GC kann den größten Teil seiner Arbeit innerhalb der wesentlich effizienteren erledigen junge Generation. Sie möchten nicht, dass Objekte in die ältere Generation verschoben werden, es sei denn, dies ist unbedingt erforderlich.