Automatic Memory ManagementAutomatic Memory Management

Gestione automatica della memoria è uno dei servizi offerti da Common Language Runtime durante l'esecuzione gestita.Automatic memory management is one of the services that the Common Language Runtime provides during Managed Execution. L'allocazione e il rilascio di memoria per un'applicazione vengono gestiti da Garbage Collector di Common Language Runtime.The Common Language Runtime's garbage collector manages the allocation and release of memory for an application. Agli sviluppatori non viene quindi richiesta la scrittura di codice per eseguire attività di gestione della memoria quando si sviluppano applicazioni gestite.For developers, this means that you do not have to write code to perform memory management tasks when you develop managed applications. La gestione automatica della memoria consente di evitare che si verifichino i problemi consueti legati alla gestione della memoria, quale la mancata liberazione di un oggetto e il conseguente spreco di memoria allocata ma non più referenziabile o il tentativo di accesso alla memoria per un oggetto già liberato.Automatic memory management can eliminate common problems, such as forgetting to free an object and causing a memory leak, or attempting to access memory for an object that has already been freed. In questa sezione viene descritta la modalità utilizzata dal Garbage Collector per l'allocazione e il rilascio di memoria.This section describes how the garbage collector allocates and releases memory.

Allocazione di memoriaAllocating Memory

Quando si inizializza un nuovo processo, per tale processo viene riservata una regione contigua di spazio degli indirizzi.When you initialize a new process, the runtime reserves a contiguous region of address space for the process. Lo spazio degli indirizzi riservato viene definito heap gestito.This reserved address space is called the managed heap. Nell'heap gestito viene conservato un puntatore all'indirizzo in cui verrà allocato il successivo oggetto dell'heap.The managed heap maintains a pointer to the address where the next object in the heap will be allocated. Le impostazioni iniziali del puntatore corrispondono all'indirizzo di base dell'heap gestito.Initially, this pointer is set to the managed heap's base address. Tutti i tipi di riferimento vengono allocati nell'heap gestito.All reference types are allocated on the managed heap. Quando il primo tipo di riferimento viene creato da un'applicazione, per tale tipo viene allocata memoria nell'indirizzo di base dell'heap gestito.When an application creates the first reference type, memory is allocated for the type at the base address of the managed heap. Quando l'oggetto successivo viene creato dall'applicazione, la memoria destinata a tale oggetto viene allocata dal Garbage Collector nello spazio degli indirizzi immediatamente successivo al primo oggetto.When the application creates the next object, the garbage collector allocates memory for it in the address space immediately following the first object. Lo spazio per i nuovi oggetti verrà allocato in questo modo dal Garbage Collector fino all'esaurimento dello spazio degli indirizzi.As long as address space is available, the garbage collector continues to allocate space for new objects in this manner.

L'allocazione della memoria dall'heap gestito risulta più veloce dell'allocazione di memoria non gestita.Allocating memory from the managed heap is faster than unmanaged memory allocation. Poiché la memoria per un oggetto viene allocata da Common Language Runtime tramite un incremento di un valore a un puntatore, tale operazione risulta veloce almeno quanto l'allocazione di memoria dallo stack.Because the runtime allocates memory for an object by adding a value to a pointer, it is almost as fast as allocating memory from the stack. Poiché inoltre i nuovi oggetti allocati consecutivamente vengono archiviati in modo contiguo nell'heap gestito, l'accesso a tali oggetti da parte dell'applicazione risulta molto rapido.In addition, because new objects that are allocated consecutively are stored contiguously in the managed heap, an application can access the objects very quickly.

Rilascio di memoriaReleasing Memory

Il modulo di ottimizzazione del Garbage Collector consente di determinare il momento migliore per l'esecuzione di una raccolta sulla base delle allocazioni in corso.The garbage collector's optimizing engine determines the best time to perform a collection based on the allocations being made. Durante l'esecuzione di una raccolta, la memoria per gli oggetti non più utilizzati dall'applicazione viene rilasciata dal Garbage Collector.When the garbage collector performs a collection, it releases the memory for objects that are no longer being used by the application. L'individuazione degli oggetti non più in uso viene effettuata tramite l'esame delle radici dell'applicazione.It determines which objects are no longer being used by examining the application's roots. Ogni applicazione dispone di un insieme di radici.Every application has a set of roots. Ogni radice fa riferimento a un oggetto dell'heap gestito o è impostata su null.Each root either refers to an object on the managed heap or is set to null. Le radici di un'applicazione includono campi statici, variabili e parametri locali su uno stack di thread e registri della CPU.An application's roots include static fields, local variables and parameters on a thread's stack, and CPU registers. Garbage Collector ha accesso all'elenco delle radici attive mantenute dal compilatore JIT e dal runtime.The garbage collector has access to the list of active roots that the just-in-time (JIT) compiler and the runtime maintain. Usando questo elenco, il Garbage Collector esamina le radici dell'applicazione e crea, nel corso di tale esame, un grafico contenente tutti gli oggetti raggiungibili dalle directory radice.Using this list, it examines an application's roots, and in the process creates a graph that contains all the objects that are reachable from the roots.

Gli oggetti non inclusi nel grafo non sono raggiungibili dalle radici dell'applicazione.Objects that are not in the graph are unreachable from the application's roots. Gli oggetti non raggiungibili vengono considerati dal Garbage Collector come oggetti da eliminare e la memoria allocata per tali oggetti viene rilasciata.The garbage collector considers unreachable objects garbage and will release the memory allocated for them. Nel corso di una raccolta, l'heap gestito viene esaminato dal Garbage Collector, alla ricerca dei blocchi di spazi degli indirizzi occupati da oggetti non raggiungibili.During a collection, the garbage collector examines the managed heap, looking for the blocks of address space occupied by unreachable objects. Quando un oggetto non raggiungibile viene rilevato, viene utilizzata una funzione di copia della memoria che consente di ricompattare lo spazio allocato per gli oggetti ancora raggiungibili nella memoria, liberando i blocchi di spazi degli indirizzi allocati per oggetti non raggiungibili.As it discovers each unreachable object, it uses a memory-copying function to compact the reachable objects in memory, freeing up the blocks of address spaces allocated to unreachable objects. Una volta compattata la memoria per gli oggetti non raggiungibili, il Garbage Collector aggiorna i puntatori agli oggetti ai rispettivi nuovi indirizzi, in modo che le radici dell'applicazione puntino agli oggetti nelle rispettive nuove posizioni.Once the memory for the reachable objects has been compacted, the garbage collector makes the necessary pointer corrections so that the application's roots point to the objects in their new locations. Il puntatore relativo all'heap gestito viene inoltre posizionato dopo l'ultimo oggetto non raggiungibile.It also positions the managed heap's pointer after the last reachable object. Si noti che la compressione della memoria viene effettuata solo se durante la raccolta viene rilevato un numero significativo di oggetti non raggiungibili.Note that memory is compacted only if a collection discovers a significant number of unreachable objects. Se tutti gli oggetti dell'heap gestito superano la raccolta, non è necessaria alcuna compressione della memoria.If all the objects in the managed heap survive a collection, then there is no need for memory compaction.

Per migliorare le prestazioni, la memoria per oggetti di grandi dimensioni viene allocata da Common Language Runtime in un heap separato.To improve performance, the runtime allocates memory for large objects in a separate heap. La memoria per oggetti di grandi dimensioni viene rilasciata automaticamente dal Garbage Collector.The garbage collector automatically releases the memory for large objects. Per evitare lo spostamento di oggetti di grandi dimensioni nella memoria, non viene effettuata la compattazione della memoria.However, to avoid moving large objects in memory, this memory is not compacted.

Generazioni e prestazioniGenerations and Performance

Per ottimizzare le prestazioni del Garbage Collector, l'heap gestito è diviso in tre generazioni: 0, 1 e 2.To optimize the performance of the garbage collector, the managed heap is divided into three generations: 0, 1, and 2. L'algoritmo del Garbage Collection del runtime si basa su svariate generalizzazioni la cui validità è stata verificata dai produttori di software per computer tramite sperimentazioni con gli schemi di Garbage Collection.The runtime's garbage collection algorithm is based on several generalizations that the computer software industry has discovered to be true by experimenting with garbage collection schemes. Prima di tutto è stato rilevato che la compattazione per una parte dell'heap gestito risulta più rapida della compressione per l'intero heap gestito.First, it is faster to compact the memory for a portion of the managed heap than for the entire managed heap. In secondo luogo, la durata degli oggetti più recenti sarà inferiore alla durata degli oggetti meno recenti.Secondly, newer objects will have shorter lifetimes and older objects will have longer lifetimes. Gli oggetti più recenti infine sono solitamente correlati e l'applicazione accede a tali oggetti quasi nello stesso momento.Lastly, newer objects tend to be related to each other and accessed by the application around the same time.

Il Garbage Collector del runtime archivia i nuovi oggetti nella generazione 0.The runtime's garbage collector stores new objects in generation 0. Gli oggetti creati nelle prime fasi della durata dell'applicazione che non vengono raccolti vengono promossi e archiviati nelle generazioni 1 e 2.Objects created early in the application's lifetime that survive collections are promoted and stored in generations 1 and 2. Il processo di promozione dell'oggetto viene descritto più avanti in questo argomento.The process of object promotion is described later in this topic. Poiché la compressione di una porzione dell'heap gestito risulta più rapida della compressione dell'intero heap, questo schema consente al Garbage Collector di rilasciare la memoria in una specifica generazione, anziché rilasciare la memoria per l'intero heap gestito a ogni raccolta.Because it is faster to compact a portion of the managed heap than the entire heap, this scheme allows the garbage collector to release the memory in a specific generation rather than release the memory for the entire managed heap each time it performs a collection.

La raccolta viene in realtà effettuata dal Garbage Collector quando la generazione 0 è piena.In reality, the garbage collector performs a collection when generation 0 is full. Se un'applicazione tenta di creare un nuovo oggetto quando la generazione 0 è piena, il Garbage Collector rileva che nella generazione 0 non è più disponibile spazio degli indirizzi da allocare per l'oggetto.If an application attempts to create a new object when generation 0 is full, the garbage collector discovers that there is no address space remaining in generation 0 to allocate for the object. Per tentare di liberare spazio degli indirizzi per l'oggetto nella generazione 0, viene effettuata una raccolta.The garbage collector performs a collection in an attempt to free address space in generation 0 for the object. Il Garbage Collector esamina prima di tutto gli oggetti presenti nella generazione 0, anziché tutti gli oggetti presenti nell'heap gestito.The garbage collector starts by examining the objects in generation 0 rather than all objects in the managed heap. Questo è infatti l'approccio più efficiente, poiché la durata degli oggetti recenti è solitamente ridotta e si presume che molti degli oggetti presenti nella generazione 0 non siano più utilizzati dall'applicazione quando si effettua una raccolta.This is the most efficient approach, because new objects tend to have short lifetimes, and it is expected that many of the objects in generation 0 will no longer be in use by the application when a collection is performed. L'effettuazione della raccolta sulla sola generazione 0 consente inoltre di recuperare spesso memoria sufficiente per consentire all'applicazione di continuare a creare nuovi oggetti.In addition, a collection of generation 0 alone often reclaims enough memory to allow the application to continue creating new objects.

Al termine della raccolta nella generazione 0 effettuata da Garbage Collector, la memoria per gli oggetti raggiungibili viene compressa come illustrato precedentemente in Rilascio di memoria in questo argomento.After the garbage collector performs a collection of generation 0, it compacts the memory for the reachable objects as explained in Releasing Memory earlier in this topic. Il Garbage Collector promuove quindi questi oggetti e questa parte dell'heap gestito viene considerata come generazione 1.The garbage collector then promotes these objects and considers this portion of the managed heap generation 1. Poiché la durata degli oggetti non raccolti è solitamente più lunga, la promozione a una generazione superiore risulta opportuna.Because objects that survive collections tend to have longer lifetimes, it makes sense to promote them to a higher generation. Il riesame degli oggetti nelle generazioni 1 e 2 da parte del Garbage Collector non sarà quindi necessario a ogni raccolta della generazione 0.As a result, the garbage collector does not have to reexamine the objects in generations 1 and 2 each time it performs a collection of generation 0.

Una volta completata la prima raccolta della generazione 0 e una volta promossi gli oggetti raggiungibili alla generazione 1, la parte restante dell'heap gestito verrà considerata dal Garbage Collector come generazione 0.After the garbage collector performs its first collection of generation 0 and promotes the reachable objects to generation 1, it considers the remainder of the managed heap generation 0. Il Garbage Collector continuerà quindi ad allocare memoria per i nuovi oggetti nella generazione 0 fino a quando la generazione 0 non risulterà piena e non sarà necessario eseguire un'altra raccolta.It continues to allocate memory for new objects in generation 0 until generation 0 is full and it is necessary to perform another collection. A questo punto il modulo di ottimizzazione del Garbage Collector consentirà di determinare se sia necessario esaminare gli oggetti delle generazioni meno recenti.At this point, the garbage collector's optimizing engine determines whether it is necessary to examine the objects in older generations. Se ad esempio una raccolta effettuata nella generazione 0 non consente di recuperare memoria sufficiente per il corretto completamento del tentativo di creazione di un nuovo oggetto da parte dell'applicazione, il Garbage Collector potrà eseguire una raccolta della generazione 1, quindi della generazione 2.For example, if a collection of generation 0 does not reclaim enough memory for the application to successfully complete its attempt to create a new object, the garbage collector can perform a collection of generation 1, then generation 2. Se la memoria recuperata non risulta sufficiente, il Garbage Collector potrà eseguire una raccolta nelle generazioni 2, 1 e 0.If this does not reclaim enough memory, the garbage collector can perform a collection of generations 2, 1, and 0. Al termine di ogni raccolta, gli oggetti raggiungibili nella generazione 0 vengono compressi dal Garbage Collector e promossi alla generazione 1.After each collection, the garbage collector compacts the reachable objects in generation 0 and promotes them to generation 1. Gli oggetti presenti nella generazione 1 non raccolti vengono promossi alla generazione 2.Objects in generation 1 that survive collections are promoted to generation 2. Poiché il Garbage Collector supporta solo tre generazioni, gli oggetti presenti nella generazione 2 non raccolti rimangono nella generazione 2 fino a quando non vengono considerati non raggiungibili da raccolte successive.Because the garbage collector supports only three generations, objects in generation 2 that survive a collection remain in generation 2 until they are determined to be unreachable in a future collection.

Rilascio di memoria per le risorse non gestiteReleasing Memory for Unmanaged Resources

Le attività di gestione della memoria necessarie vengono effettuate dal Garbage Collector per la maggior parte degli oggetti creati dall'applicazione.For the majority of the objects that your application creates, you can rely on the garbage collector to automatically perform the necessary memory management tasks. Per le risorse non gestite è tuttavia necessario il rilascio esplicito.However, unmanaged resources require explicit cleanup. Il tipo più comune di risorsa non gestita è rappresentato da un oggetto che esegue il wrapping di una risorsa del sistema operativo, quale un handle di file, un handle di finestra o una connessione di rete.The most common type of unmanaged resource is an object that wraps an operating system resource, such as a file handle, window handle, or network connection. Benché il Garbage Collector sia in grado di tenere traccia della durata di un oggetto gestito in cui è incapsulata una risorsa non gestita, non dispone di dati sufficienti per effettuare il rilascio della risorsa.Although the garbage collector is able to track the lifetime of a managed object that encapsulates an unmanaged resource, it does not have specific knowledge about how to clean up the resource. Quando si crea un oggetto che incapsula una risorsa non gestita, si consiglia di fornire il codice necessario per il rilascio della risorsa non gestita in un metodo Dispose pubblico.When you create an object that encapsulates an unmanaged resource, it is recommended that you provide the necessary code to clean up the unmanaged resource in a public Dispose method. Fornendo un metodo Dispose si consente agli utenti dell'oggetto di liberarne esplicitamente la memoria al termine delle operazioni che richiedono tale oggetto.By providing a Dispose method, you enable users of your object to explicitly free its memory when they are finished with the object. Quando si usa un oggetto che incapsula una risorsa non gestita, si consiglia di tenere in considerazione il metodo Dispose e di chiamarlo in caso di necessità.When you use an object that encapsulates an unmanaged resource, you should be aware of Dispose and call it as necessary. Per altre informazioni su come pulire una risorsa non gestita e per un esempio di modello di progettazione per l'implementazione del metodo Dispose, vedere Garbage Collection.For more information about cleaning up unmanaged resources and an example of a design pattern for implementing Dispose, see Garbage Collection.

Vedere ancheSee Also

GC
Garbage CollectionGarbage Collection
Processo di esecuzione gestitaManaged Execution Process