2015-09-25 28 views
5

Nie mogę wymyślić implementacji niektórych operacji dla niezmiennych sekwencji Scali. Użyję tego jako przykładu:Jak działa zarządzanie pamięcią dla kolekcji Scala?

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

    list0.tail 
} 

Gdy funkcja się skończy, lista0 jest poza zakresem. Czy głowa listy0 zostanie usunięta z pamięci, czy lista0 pozostanie taka sama, dopóki cała lista nie zostanie zebrana?

+0

Scala używa takiego garbage collectora jak Java. Tak więc ta lista zostanie usunięta z pamięci, gdy gc zostanie uruchomione ponownie przez jvm i uświadomimy sobie, że ten obiekt może zostać zebrany. – Everv0id

Odpowiedz

6

W twoim przykładzie kierownik list0 zostanie pozostawiony do kosza do zbierania śmieci, ponieważ nic go nie odwoła. Pozostałe elementy (ogon) będą jednak istnieć po wyjściu z funkcji (pod warunkiem, że wynik połączenia jest przypisany do czegoś).

Każda komórka na liście zachowuje odwołanie do następnej komórki na liście (lub do Nil), ale nie odwrotnie.

+0

Czy fakt, że głowa ma odniesienie do innego węzła, uniemożliwia jej zbieranie śmieci? Czy ten odnośnik został usunięty, gdy wykracza poza zakres? – user3599828

+6

Nie, śmieciarz nie dba o to, czy przedmiot ma swoje własne odniesienia do innych rzeczy; to tylko obchodzi, że przedmiot nie ma nic innego, co dotyczy * it *. Dopóki jest to prawdą, przedmiot jest kandydatem do zbierania śmieci. – kes

1

Podczas tworzenia łącznie 12 (ewentualnego) jednostek

  1. list0 - listę zawierającą od 1 do 10.
  2. 10 poszczególnych elementów w zakresie od 1 do 10. Mogą to być internowany, ale to jest inna dyskusja.
  3. Wartość zwracana, list0.tail, która zawiera elementy 2-10.

Oto koncepcyjny wykres pamięci tuż przed ostatnim nawias klamrowy, oto referencje

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

Gdy funkcja jest wykonywana, odniesienie list0 zostanie zdjęty i będzie kwalifikować się do zbieranie śmieci. Od list0 jest jedyną rzeczą, która odwołuje się do 1, 1 jest również gra fair dla zbierania śmieci.

Elementy 2-10, a także zwrócona lista zawierająca je pozostaną na stercie, ponieważ ten, kto odwołuje się do example, jest nadal dostępny dla uruchomionego kodu.

Mam nadzieję, że to pomoże.