Malo o garbage collectorima

  • Začetnik teme Začetnik teme bmaxa
  • Datum pokretanja Datum pokretanja

bmaxa

Legenda
Poruka
70.808
Elem, problem automatske alokacije memorije je postao aktuelan
u funkcionalnim jezicima gde postoji suma referenci tako da je
manualna alokacija memorije gotovo nemoguca.
Sta je GC?
To je thread koji obavlja funkciju "ciscenja" tj dealokacije memorije.
Sta je neophodno da se ovo obavi?
Neophodno je da iskanira memoriju za referencama koje vise
nisu referencirane. Kako to obavlja? Skenira stek, heap
i static space na pointere. Ukoliko nema pointera na odredjeni
blok memorije, markira da se moze "ocistiti". Potom oslobadja
i eventualno zove finalizere.
Sta mora da uradi? Da bi bezbedno mogao da iskanira memoriju,
prvo mora da zaustavi korisnicke threadove. Najprostiji je "stop the world"
GC, koji zaustavlja sve threadove, potom skanira, potom ih restartuje.
ima vise varijanti, cak onih koji ne zaustavljaju threadove, nego
koriste memorijsku barijeru koja se postavlja pre svakog pristupa
pointeru, ali za to je potrebna podrska jezika.
I to bi bilo to ukratko.
 
Da dopunim. Obican collector je samo malloc kao u C-u.
Medjutim postoje collectori koji vrse defragmentaciju memorije, tzv compacting collectori kao sto je onaj u .NET.
Sta oni rade?
Kada dodje faza za dealokaciju alociraju jedan veliki blok na heapu, potom idu kroz sve reference koje su validne,
i redom kopira sve blokove u novi blok, sto eliminise fragmentaciju, potom apdejtuje sve reference da pokazuju na novu lokaciju.
Potom jednom free oslobadja stari blok. Za ovo je potrebna podrska jezika
 

Back
Top