Garbage Collector

di Marco Leoncini, in miscellaneous,

in questi giorni di festa, oltre alla scontata intossicazione da pandoro e affini, partitelle ad Halo2 (sig sono stato retrocesso da livello 8 a 7 un onta che devo lavare via) e telefonate varie, ho deciso di approfondire un pò la gestione della memoria.
come sappiamo la gestione della memoria automatica è uno dei servizi che mette a disposizione il Common Language Runtime , togliendo un bel peso al programmatore, infatti non è richiesto scrivere nessun codice atto alla gestione della memoria.
anche se tutto avviene in maniera trasparente , esistono alcune tecniche per ottimizzare l'uso della memoria (magari ne parlo in un altra bloggata, visto che devo finire di digerire l'articolo in inglese), come funziona l'allocazione della memoria? quando si inizializza un nuovo processo, questo si riserva una porzione di memoria contigua che prende il nome di Heap gestito, al suo interno conserva un puntatore alla locazione di memoria libera, tutti i tipi riferimento vengono immagazzinati nel Heap gestito. la memorizzazione è un processo altamente efficace e veloce visto che avvine incrementando semplicemte il puntatore.
l'Heap gestito è suddivisoin 3 "sezione" 0,1,2 gli oggetti vengono aggiunti fino a quando non rimepiono completamente la sezione 0, al tentativo di inserire un nuovo oggetto, essenzo lo spazio insufficente, viene avviata la raccolta delle risorse inutilizzate, per far questo il Garbage Collector esamita la root dell'applicazione, un applicazione ha diverse root che contengono riferimenti a oggetti creati nel heap, nello stak, i registri della Cpu ed altro ancora, durante questo esame viene costruito un grafo degli oggetti raggiungibili dall'applicazione, di conseguenza gli oggeti prenseti nel Heap e non più raggiungibili vengono cancellati, la memoria compattata(solo se vengono rilevati un numero significativo di oggetti non raggiungibili), aggiornato il puntatore e la root dell'applicazione, come detto (sarebbe meglio dire ho letto :)) Heap è diviso in 3 parti, questa suddivisione viene fatta al fine di migliorare le prestazioni, in pratica gli oggetti vengono inseriti nella sezione (prendono il nome di generazioni) 0, quelli che superano la raccolta sengono compressi e spostati nella generazione 1, questo perche comprimere una parte del heap è più veloce che fare la solita operazione su tutto, il processo di inserimento continua, gli oggetti vengono inseriti nella generazione 0, quando è piena scatta la raccolta, chi" ne esce vivo" ed era nella generazione 0 viene promosso nella 1 chi era nella 1 alla 2 chi si trovava già in nella genrazione 2 rimane li, in pratica gli oggetit nuovi (e di breve durata) si trovano nella genrazione 0, nella 1 si trovano quelli a media durata ed in fine nella 2 quelli con una maggore durata, inoltre gli oggetti di grosse dimensioni vengono memorizzati in un Heap apparte.
conoscere il processo non è necessario ad un programmatore che scrive codice gestito, ma conoscere anche solo a grandi linee il comportamento dietro le quinte può aiutare a farsi un idea di come muoversi in certe situazioni, volgio ritornare sull'argomento (anche perche mi appassiona) non appena riesco a uscire dall'articolo che sto leggendo non sono una cima con le lingue, e le parole che imparo giocando LIVE con americani ed inglesi non sono riutilizzabili :)

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese