You are on page 1of 6

Principi fondamentali di Garbage Collection

Il presente articolo stato tradotto manualmente. Passare il puntatore sulle frasi nell'articolo per visualizzare il testo originale. Ulteriori informazioni.

Pagina 1

Principi fondamentali di Garbage Collection


.NET Framework 4.5 Questo argomento non stato ancora valutato - Valuta questo argomento In Common Language Runtime (CLR) il Garbage Collector funge da gestore di memoria automatico, offrendo i seguenti vantaggi: Consente di sviluppare un'applicazione senza alcun bisogno di liberare memoria. Alloca gli oggetti nell'heap gestito in maniera efficiente. Recupera gli oggetti inutilizzati, ne cancella la memoria e tiene la memoria a disposizione per le future allocazioni. Gli oggetti gestiti ottengono automaticamente contenuto pulito con il quale iniziare, pertanto i costruttori non devono inizializzare ogni campo dati. Garantisce protezione per la memoria assicurando che un oggetto non possa utilizzare il contenuto di un altro oggetto. In questo argomento vengono descritti i concetti principali di Garbage Collection. Include le sezioni seguenti: Nozioni fondamentali sulla memoria Condizioni per un'operazione di Garbage Collection Heap gestito Generazioni Fasi di un'operazione di Garbage Collection Modifica delle risorse non gestite Garbage Collection per workstation e server Garbage Collection in modalit simultanea Garbage Collection in background Garbage Collection in background

Nozioni fondamentali sulla memoria


Nell'elenco seguente sono riepilogati concetti importanti relativi alla memoria CLR. Ogni processo dispone di un proprio spazio degli indirizzi virtuali distinto. Tutti i processi nello stesso computer condividono la stessa memoria fisica e condividono il file di paging, se presente. Per impostazione predefinita, nei computer a 32 bit ogni processo dispone di uno spazio degli indirizzi virtuali in modalit utente da 2 GB. Uno sviluppatore di applicazioni utilizza solo lo spazio degli indirizzi virtuali e non modifica mai direttamente la memoria fisica. Il Garbage Collector alloca e libera automaticamente la memoria virtuale nell'heap gestito. Se si sta scrivendo in codice nativo, si utilizzano funzioni Win32 per lavorare con lo spazio degli indirizzi virtuali. Queste funzioni allocano e liberano automaticamente la memoria virtuale negli heap nativi. La memoria virtuale pu trovarsi in tre stati: Libero. Non vi sono riferimenti al blocco di memoria, che disponibile per l'allocazione. Riservato. Il blocco di memoria disponibile per l'utilizzo e non pu essere utilizzato da un'altra richiesta di allocazione. Non tuttavia possibile archiviare i dati in questo blocco di memoria fino a quando non viene eseguito il commit. Eseguito. Il blocco di memoria assegnato all'archiviazione fisica. Lo spazio degli indirizzi virtuali pu diventare frammentato. Ci significa che sono presenti blocchi liberi, noti anche come buchi, nello spazio degli indirizzi. Quando viene richiesta un'allocazione della memoria virtuale, il gestore di memoria virtuale deve trovare un singolo blocco libero con dimensioni sufficienti per soddisfare la richiesta di allocazione. Anche se si dispone di 2 GB di spazio disponibile, l'allocazione che richiede 2 GB avr esito negativo a meno che tutto lo spazio si trovi in un unico blocco di indirizzi. possibile esaurire la memoria se si esaurisce lo spazio degli indirizzi virtuali da riservare o lo spazio fisico di cui eseguire il commit. Il file di paging viene utilizzato anche se la pressione della memoria fisica (ovvero, la richiesta di memoria fisica) bassa. La prima volta che la pressione della memoria fisica elevata, il sistema operativo deve fare spazio nella memoria fisica per archiviare i dati ed esegue il backup di alcuni dei dati che si trovano nella memoria fisica nel file di paging. Il paging dei dati non viene eseguito fino a quando non necessario, pertanto possibile riscontrare il paging in situazioni in cui la pressione della memoria fisica molto bassa.

PDF created with pdfFactory trial version www.pdffactory.com

http://msdn.microsoft.com/it-it/library/ee787088.aspx

19/10/2012 17.06.22

Principi fondamentali di Garbage Collection

Pagina 2

La memoria utilizzata dagli oggetti allocati nell'heap gestito supera una soglia accettabile. In altre parole, una soglia di utilizzo della memoria accettabile stata superata nell'heap gestito. Questa soglia viene continuamente modificata durante l'esecuzione del processo. Viene chiamato il metodo GC.Collect. Nella quasi totalit dei casi non necessario chiamare questo metodo, in quanto il Garbage Collector viene eseguito senza interruzioni. Il metodo viene utilizzato principalmente in situazioni eccezionali e per scopi di test. Torna all'inizio

Heap gestito
Dopo essere stato inizializzato da CLR, il Garbage Collector alloca un segmento di memoria per archiviare e gestire oggetti. Questa memoria definita heap gestito, in contrapposizione a un heap nativo presente nel sistema operativo. Per ogni processo gestito esiste un heap gestito. Tutti i thread nel processo allocano gli oggetti nello stesso heap. Per riservare la memoria, il Garbage Collector chiama la funzione VirtualAlloc Win32 e riserva un segmento di memoria per volta per le applicazioni gestite. Il Garbage Collector riserva inoltre i segmenti secondo le esigenze e li rilascia al sistema operativo, dopo aver cancellato tutti gli oggetti, chiamando la funzione VirtualFree Win32. Minore il numero di oggetti allocati nell'heap, minore sar il lavoro del Garbage Collector. Quando si allocano oggetti, non utilizzare valori arrotondati per eccesso che superino le proprie esigenze, ad esempio non allocare una matrice di 32 byte se sono necessari solo 15 byte. Quando viene attivata un'operazione di Garbage Collection, il Garbage Collector recupera la memoria occupata dagli oggetti inutilizzati. Durante il processo di recupero, gli oggetti attivi vengono compattati in modo da poter essere spostati insieme e lo spazio inutilizzato viene rimosso, riducendo le dimensioni dell'heap. In questo modo si garantisce che gli oggetti allocati insieme restino uniti nell'heap gestito, preservandone la vicinanza. L'impatto (frequenza e durata) delle operazioni di Garbage Collection il risultato del volume di allocazioni e della quantit di memoria esclusa nell'heap gestito. L'heap pu essere considerato l'insieme di due heap: l'heap degli oggetti grandi e l'heap degli oggetti piccoli. L'heap degli oggetti grandi contiene oggetti di dimensioni pari o superiori a 85.000 byte. Gli oggetti molto grandi in questo heap sono in genere matrici. raro che un oggetto istanza sia particolarmente grande. Torna all'inizio

Generazioni
L'heap organizzato in generazioni, cos da poter gestire oggetti di lunga durata e di breve durata. Durante un'operazione di Garbage Collection vengono recuperati per primi gli oggetti di breve durata, che in genere occupano solo una piccola parte dell'heap. Esistono tre generazioni di oggetti nell'heap: Generazione 0. la generazione pi recente e contiene oggetti di breve durata. Un esempio di oggetto di breve durata una variabile temporanea. Le operazioni di Garbage Collection vengono eseguite il pi delle volte in questa generazione. Gli oggetti appena allocati formano una nuova generazione di oggetti e sono implicitamente raccolte di generazione 0, a meno che non siano oggetti grandi, nel qual caso vengono inseriti nell'heap degli oggetti grandi in una raccolta di generazione 2. Gran parte degli oggetti vengono recuperati tramite Garbage Collection nella generazione 0 e non passano alla generazione successiva. Generazione 1. Questa generazione contiene oggetti di breve durata e funge da buffer tra gli oggetti di breve durata e gli oggetti di lunga durata. Generazione 2. Questa generazione contiene oggetti di lunga durata. Un esempio di oggetto di lunga durata un oggetto in un'applicazione server contenente dati statici che restano attivi per la durata del processo. Le operazioni di Garbage Collection vengono eseguite in generazioni specifiche a seconda delle condizioni. Raccogliere una generazione significa raccogliere gli oggetti in quella generazione e in tutte le generazioni pi recenti. Un'operazione di Garbage Collection di generazione 2 viene definita completa, in quanto recupera tutti gli oggetti in tutte le generazioni, vale a dire tutti gli oggetti nell'heap gestito.

Esclusione e promozioni
Gli oggetti che non vengono recuperati durante un'operazione di Garbage Collection sono definiti oggetti esclusi e vengono promossi alla generazione successiva. Gli oggetti esclusi da un'operazione di Garbage Collection di generazione 0 vengono promossi alla generazione 1; gli oggetti esclusi da un'operazione di Garbage Collection di generazione 1 vengono promossi alla generazione 2; gli oggetti esclusi da un'operazione di Garbage Collection di generazione 2 restano nella generazione 2. Quando il Garbage Collector rileva un tasso di esclusione elevato in una generazione, aumenta la relativa soglia delle allocazioni, in modo che la raccolta successiva generi un recupero di memoria sostanziale. CLR bilancia continuamente due priorit: impedire che il working set di un'applicazione diventi troppo grande e limitare la durata delle operazioni di Garbage Collection.

Generazioni e segmenti temporanei


Poich gli oggetti nelle generazioni 0 e 1 sono di breve durata, queste vengono definite generazioni temporanee. Le generazioni temporanee devono essere allocate nel segmento di memoria noto come segmento temporaneo. Ogni nuovo

PDF created with pdfFactory trial version www.pdffactory.com

http://msdn.microsoft.com/it-it/library/ee787088.aspx

19/10/2012 17.06.22

Principi fondamentali di Garbage Collection


Torna all'inizio

Pagina 3

Fasi di un'operazione di Garbage Collection


Un'operazione di Garbage Collection si compone delle seguenti fasi: Una fase di contrassegno in cui vengono individuati tutti gli oggetti attivi e ne viene creato un elenco. Una fase di rilocazione in cui vengono aggiornati i riferimenti agli oggetti che saranno compattati. Una fase di compattazione in cui lo spazio occupato dagli oggetti inutilizzati viene recuperato e gli oggetti esclusi compattati. Durante questa fase, gli oggetti rimasti dopo un'operazione di Garbage Collection vengono spostati verso l'estremit meno recente del segmento. Poich le raccolte di generazione 2 possono occupare pi segmenti, gli oggetti promossi alla generazione 2 possono essere spostati in un segmento meno recente. Gli oggetti esclusi di generazione 1 e 2 possono essere spostati in un segmento diverso, in quanto vengono promossi alla generazione 2. L'heap degli oggetti grandi non compressa, perch copiare grandi gli oggetti applicata una riduzione delle prestazioni. Per stabilire se gli oggetti sono attivi, il Garbage Collector utilizza le seguenti informazioni: Radici dello stack. Variabili dello stack fornite dal compilatore JIT e dal percorso di chiamate nello stack. Handle di Garbage Collection. Handle che puntano agli oggetti gestiti e che possono essere allocati mediante codice utente o Common Language Runtime. Dati statici. Oggetti statici nei domini applicazione che possono fare riferimento ad altri oggetti. Ogni dominio applicazione tiene traccia dei rispettivi oggetti statici. Prima di eseguire un'operazione di Garbage Collection, tutti i thread gestiti vengono sospesi, eccetto il thread che attiva l'operazione. Nell'illustrazione seguente viene illustrato un thread che attiva un'operazione di Garbage Collection causando la sospensione degli altri thread. Thread che attiva un'operazione di Garbage Collection

Torna all'inizio

Modifica delle risorse non gestite


Se gli oggetti gestiti fanno riferimento a oggetti non gestiti tramite i relativi handle di file nativi, necessario liberare in modo esplicito gli oggetti gestiti, poich il Garbage Collector tiene traccia della memoria solo nell'heap gestito. possibile che gli utenti dell'oggetto gestito non eliminino le risorse native utilizzate dall'oggetto. Per eseguire la pulizia, possibile rendere l'oggetto gestito finalizzabile. La finalizzazione consiste in azioni di pulizia che si eseguono quando l'oggetto non pi utilizzato. Quando l'oggetto gestito cessa di essere utilizzato, esegue azioni di pulizia specificate nel metodo del relativo finalizzatore. Quando viene individuato un oggetto finalizzabile inutilizzato, il relativo finalizzatore viene inserito in una coda in modo che vengano eseguite le azioni di pulizia, mentre l'oggetto stesso viene promosso alla generazione successiva. Sar pertanto necessario attendere l'operazione di Garbage Collection successiva eseguita in tale generazione, che non sar necessariamente l'operazione immediatamente successiva, per stabilire se l'oggetto stato recuperato. Torna all'inizio

Garbage Collection per workstation e server


Il Garbage Collector si regola da s e pu funzionare in un'ampia variet di scenari. L'unica opzione che possibile impostare il tipo di operazione da eseguire, in base alle caratteristiche del carico di lavoro. CLR fornisce i seguenti tipi di Garbage Collection: Garbage Collection per workstation, per tutte le workstation client e i PC autonomi. l'impostazione predefinita per l'elemento <gcServer> nello schema di configurazione di runtime. Le operazioni di Garbage Collection per workstation possono essere eseguite in modalit simultanea o non simultanea. La modalit simultanea consente ai thread gestiti di continuare le operazioni durante un'operazione di Garbage Collection.

PDF created with pdfFactory trial version www.pdffactory.com

http://msdn.microsoft.com/it-it/library/ee787088.aspx

19/10/2012 17.06.22

Principi fondamentali di Garbage Collection

Pagina 4

Configurazione di Garbage Collection


possibile utilizzare l'elemento <gcServer> dello schema di configurazione di runtime per specificare il tipo di operazione di Garbage Collection da eseguire tramite CLR. Quando l'attributo enabled di questo elemento impostato su false (impostazione predefinita), CLR esegue un'operazione di Garbage Collection per workstation. Quando si imposta l'attributo enabled su true, CLR esegue un'operazione di Garbage Collection per server. La modalit simultanea viene specificata con l'elemento <gcConcurrent> dello schema di configurazione di runtime. L'impostazione predefinita enabled. Questa modalit disponibile solo per le operazioni di Garbage Collection per workstation e non influisce sulle operazioni di Garbage Collection per server. inoltre possibile specificare operazioni di Garbage Collection per server con interfacce di hosting non gestite. Si noti che ASP.NET e SQL Server abilitano automaticamente le operazioni di Garbage Collection per server se l'applicazione ospitata in uno di questi ambienti.

Confronto tra Garbage Collection per workstation e server


Le seguenti considerazioni su threading e prestazioni riguardano le operazioni di Garbage Collection per workstation: La raccolta viene eseguita nel thread dell'utente che ha attivato l'operazione di Garbage Collection e mantiene la stessa priorit. Poich i thread dell'utente vengono in genere eseguiti con priorit normale, il Garbage Collector (eseguito in un thread con priorit normale) deve competere con altri thread per il tempo CPU. I thread che eseguono codice nativo non vengono sospesi. Le operazioni di Garbage Collection per workstation sono sempre eseguite in computer con un unico processore, indipendentemente dall'impostazione di <gcServer>. Se si specifica un'operazione di Garbage Collection per server, tramite CLR viene utilizzata la modalit per workstation, con la modalit simultanea disabilitata. Le seguenti considerazioni su threading e prestazioni riguardano le operazioni di Garbage Collection per server: La raccolta viene eseguita in pi thread dedicati eseguiti con livello di priorit THREAD_PRIORITY_HIGHEST . Per ogni CPU vengono forniti un thread dedicato per l'esecuzione delle operazioni di Garbage Collection e un heap; gli heap vengono raccolti contemporaneamente. Ogni heap contiene un heap degli oggetti piccoli e un heap degli oggetti grandi; possibile accedere a tutti gli heap tramite codice utente. Gli oggetti contenuti in heap diversi possono fare riferimento l'un l'altro. Grazie all'utilizzo congiunto di pi thread di Garbage Collection, le operazioni di Garbage Collection per server saranno pi veloci delle operazioni per workstation in un heap di pari dimensioni. I segmenti di Garbage Collection per server sono spesso di dimensioni maggiori. Le operazioni di Garbage Collection per server possono richiedere un utilizzo di risorse elevato. Ad esempio, se si hanno 12 processi in esecuzione in un computer dotato di 4 processori, si avranno 48 thread di Garbage Collection dedicati, a condizione che tutti utilizzino operazioni di Garbage Collection per server. In una situazione di caricamento di memoria elevato, se tutti i processi eseguono operazioni di Garbage Collection, il Garbage Collector avr 48 thread da pianificare. Se si eseguono centinaia di istanze di un'applicazione, consigliabile utilizzare operazioni di Garbage Collection per workstation con la modalit simultanea disabilitata. Si avranno meno cambi di contesto e un possibile miglioramento delle prestazioni. Torna all'inizio

Garbage Collection in modalit simultanea


In di Garbage Collection per workstation o server, possibile attivare la modalit simultanea, che consente ai thread contemporaneamente a un thread dedicato che esegue la Garbage Collection per la durata della raccolta. Questa opzione riguarda solo le operazioni di Garbage Collection nella generazione 2; le generazioni 0 e 1 sono sempre non simultanee in quanto terminano molto velocemente. La modalit simultanea consente alle applicazioni interattive una maggiore efficienza di risposta riducendo al minimo le pause di una raccolta. possibile continuare a eseguire i thread gestiti per la maggior parte del tempo in cui viene eseguito

PDF created with pdfFactory trial version www.pdffactory.com

http://msdn.microsoft.com/it-it/library/ee787088.aspx

19/10/2012 17.06.22

Principi fondamentali di Garbage Collection


segmento, sar necessario attendere il termine dell'operazione di Garbage Collection simultanea, mentre i thread gestiti responsabili delle allocazioni degli oggetti piccoli vengono sospesi.

Pagina 5

Le operazioni di Garbage Collection simultanee dispongono di un working set leggermente pi ampio rispetto alle operazioni non simultanee, in quanto durante la raccolta simultanea possibile allocare oggetti. Tuttavia questo pu influire sulle prestazioni, poich gli oggetti allocati diventano parte del working set. Essenzialmente, la modalit simultanea sacrifica parte della CPU e della memoria in favore di pause pi brevi. Nell'illustrazione riportata di seguito viene mostrata l'esecuzione simultanea di un'operazione di Garbage Collection in un thread dedicato separato. Garbage Collection contemporanea

Torna all'inizio

Garbage Collection in background per workstation


In un'operazione di Garbage Collection in background, le generazioni temporanee (0 e 1) vengono raccolte in base alle esigenze mentre in corso la raccolta di generazione 2. La modalit Garbage Collection in background non prevede impostazioni; viene abilitata automaticamente con la modalit simultanea. Le operazioni di Garbage Collection in background vengono utilizzate in sostituzione delle operazioni simultanee. Al pari di queste ultime, le operazioni di Garbage Collection in background vengono eseguite in un thread dedicato e sono applicabili unicamente alle raccolte di generazione 2.

Nota
Le operazioni di Garbage Collection in background sono disponibili solo in .NET Framework 4 e versioni successive. In .NET Framework 4, supportato solo per la Garbage Collection per workstation. A partire da.NET Framework 4,5, il Garbage Collection in background disponibile sia per la workstation che il Garbage Collection per server. Una raccolta nelle generazioni temporanee durante un'operazione in background definita Garbage Collection in primo piano. Durante l'esecuzione di un'operazione di Garbage Collection in primo piano, tutti i thread gestiti vengono sospesi. Quando in corso un'operazione in background ed stato allocato un numero sufficiente di oggetti nella generazione 0, CLR esegue un'operazione di Garbage Collection in primo piano della generazione 0 o 1. Il thread di Garbage Collection in background dedicato esegue controlli in corrispondenza di punti sicuri frequenti per stabilire se vi sia una richiesta di Garbage Collection in primo piano. In caso affermativo, la raccolta in background si autosospende in modo che possa essere eseguita l'operazione in primo piano. Una volta completata tale operazione, si ha la ripresa del thread di Garbage Collection in background dedicato e dei thread dell'utente. La modalit in background elimina le restrizioni di allocazione imposte dalla modalit simultanea, dal momento che durante un'operazione di Garbage Collection in background possibile eseguire operazioni temporanee. Ci significa che, durante un'operazione di Garbage Collection di generazione 1, la modalit in background in grado di rimuovere gli oggetti inutilizzati nelle generazioni temporanee ed anche espandere l'heap in base alle esigenze. Torna all'inizio

Garbage Collection in background


A partire da.NET Framework 4,5, il Garbage Collection in background la modalit predefinita per la Garbage Collection per server. Per scegliere questa modalit, impostare l'attributo enabled elemento di<gcServer> a true nello schema di configurazione di runtime. Questo metodo funziona in modo analogo a Garbage Collection in background per workstation, descritta nella sezione precedente, ma esistono alcune differenze: Il Garbage Collection in background per workstation utilizza un thread in background dedicato di Garbage Collection, mentre la Garbage Collection in background vengono utilizzati i thread, in genere un thread dedicato per ogni processore logico. A differenza del thread in background di Garbage Collection per workstation, questi thread non fanno scaduto.

Vedere anche
Altre risorse Garbage Collection

PDF created with pdfFactory trial version www.pdffactory.com

http://msdn.microsoft.com/it-it/library/ee787088.aspx

19/10/2012 17.06.22

Principi fondamentali di Garbage Collection

Pagina 6

Contenuto della community


2012 Microsoft. Tutti i diritti riservati.

PDF created with pdfFactory trial version www.pdffactory.com

http://msdn.microsoft.com/it-it/library/ee787088.aspx

19/10/2012 17.06.22

You might also like