2015-09-25 5 views
5

Ich kann die Implementierung einiger Operationen für die unveränderlichen Scala-Sequenzen nicht herausfinden. Ich werde das als ein Beispiel verwenden:Wie funktioniert das Speichermanagement für Scala Collections?

def example: List[Int] = { 
    val list0 = List.range(1,10) 

    list0.tail 
} 

Sobald die Funktion beendet ist, ist die Ausführung von list0 jetzt nicht mehr möglich. Würde der Kopf von list0 aus dem Speicher entfernt werden, oder würde list0 gleich bleiben, bis die gesamte Liste von Garbage Collection gesammelt wird?

+0

Scala verwendet Garbage Collector wie Java. Also wird diese Liste aus dem Speicher entfernt, wenn gc von jvm erneut gestartet wird und erkennen, dass dieses Objekt gesammelt werden kann. – Everv0id

Antwort

6

In Ihrem Beispiel wird der Kopf von list0 dem Garbage Collector überlassen, um zu sammeln, da nichts darauf verweisen wird. Die verbleibenden Elemente (das Endstück) bleiben jedoch beim Verlassen der Funktion bestehen (vorausgesetzt, das Ergebnis des Aufrufs ist etwas zugewiesen).

Jede Zelle in einer Liste verwaltet einen Verweis auf die nächste Zelle in der Liste (oder Nil), aber nicht umgekehrt.

+0

Verhindert die Tatsache, dass der Kopf einen Verweis auf einen anderen Knoten hat, das Sammeln von Müll? Wird diese Referenz entfernt, sobald sie den Gültigkeitsbereich verlässt? – user3599828

+6

Nein, der Müllsammler kümmert sich nicht, wenn ein Gegenstand seine eigenen Verweise auf andere Dinge hat; es ist nur wichtig, dass der Gegenstand nichts anderes hat als * it *. Solange dies der Fall ist, ist das Element ein Kandidat für die Garbage Collection. – kes

1

Du

  1. list0 insgesamt 12 (mögliche) Einheiten zu schaffen - Eine Liste 1 bis 10.
  2. Die 10 einzelnen Elemente im Bereich von 1 bis 10, enthaltend Diese könnten interniert, aber Das ist eine andere Diskussion.
  3. Der Rückgabewert list0.tail, der die Elemente 2-10 enthält.

ist der konzeptionelle Speicher Graph kurz vor der letzten geschweiften Klammer, hier sind die Referenzen

  Somewhere on JVM Stack list0(head)->1->2 ... ->10 
               | 
Top of JVM Stack, contains returnList with head->| 

Wenn die Funktion die Referenz getan wird, wird list0 taucht ab und wird für förderfähig Müllabfuhr. Da list0 das einzige Ding ist, das 1 referenzierte, ist 1 ein faires Spiel für Garbage Collection.

Die Elemente 2-10 sowie die zurückgegebene Liste, die sie enthält, bleiben auf dem Heap, da der Benutzer, der auf example verweist, immer noch über den laufenden Code erreichbar ist.

Hoffe, das hilft.