Raccolte indotte

Nella maggior parte dei casi, tramite il Garbage Collector è possibile determinare il momento migliore per eseguire una raccolta ed è consigliabile consentire l'esecuzione in modo indipendente. In rari casi una raccolta forzata può migliorare le prestazioni dell'applicazione. In questi casi, è possibile indurre un'operazione di Garbage Collection usando il metodo GC.Collect per forzarla.

Usare il metodo GC.Collect quando si verifica una riduzione significativa della quantità di memoria usata in un momento specifico nel codice dell'applicazione. Se, ad esempio, l'applicazione usa una finestra di dialogo complessa con numerosi controlli, chiamando il metodo Collect quando la finestra di dialogo è chiusa è possibile migliorare le prestazioni, recuperando immediatamente la memoria usata dalla finestra di dialogo. Assicurarsi che l'applicazione non induca troppo spesso l'operazione di Garbage Collection, in quanto può causare una riduzione delle prestazioni se il Garbage Collector tenta di recuperare oggetti in momenti non ottimali. È possibile fornire un valore di enumerazione GCCollectionMode.Optimized al metodo Collect in modo che la raccolta venga eseguita solo quando l'operazione è produttiva, come descritto nella sezione seguente.

Modalità di raccolta Garbage Collection

È possibile usare uno degli overload del metodo GC.Collect che include un valore GCCollectionMode per specificare il comportamento di una raccolta forzata, come indicato di seguito.

Valore GCCollectionMode Descrizione
Default Usa l'impostazione di Garbage Collection predefinita per la versione di .NET in esecuzione.
Forced Forza l'esecuzione immediata dell'operazione di Garbage Collection. Equivale alla chiamata dell'overload di GC.Collect(). Restituisce una raccolta di blocco completa di tutte le generazioni.

È anche possibile compattare l'heap di oggetti di grandi dimensioni impostando la proprietà GCSettings.LargeObjectHeapCompactionMode su GCLargeObjectHeapCompactionMode.CompactOnce prima di forzare una procedura completa immediata di Garbage Collection di blocco.
Optimized Consente al Garbage Collector di determinare se il momento corrente è ottimale per recuperare oggetti.

Il Garbage Collector può determinare che una raccolta non è sufficientemente produttiva per giustificarne l'esecuzione, nel qual caso esce dalla funzione senza recuperare oggetti.

Raccolte in background o di blocco

È possibile chiamare l'overload del metodo GC.Collect(Int32, GCCollectionMode, Boolean) per specificare se una raccolta indotta è di blocco o meno. Il tipo di raccolta eseguita dipende da una combinazione dei parametri mode e blocking del metodo. mode è un membro dell'enumerazione GCCollectionMode e blocking è un valore Boolean. La tabella seguente riepiloga l'interazione degli argomenti mode e blocking.

mode blocking = true blocking = false
Forced oppure Default Viene eseguita una raccolta di blocco il prima possibile. Se è in corso una raccolta in background e il valore di generation è 0 o 1, il metodo Collect(Int32, GCCollectionMode, Boolean) attiva immediatamente una raccolta di blocco e restituisce un risultato al termine della raccolta. Se è in corso una raccolta in background e il parametro generation è 2, il metodo attende fino a quando la raccolta in background non viene completata, attiva una raccolta di blocco di generazione 2 e quindi restituisce il risultato. Viene eseguita una raccolta il prima possibile. Il metodo Collect(Int32, GCCollectionMode, Boolean) richiede una raccolta in background, la cui esecuzione non è comunque garantita. A seconda della situazione, può venire comunque eseguita una raccolta di blocco. Se è già in corso una raccolta in background, il metodo viene restituito immediatamente.
Optimized Può venire eseguita una raccolta di blocco, a seconda dello stato del Garbage Collector e del parametro generation. Il Garbage Collector tenta di garantire prestazioni ottimali. È possibile eseguire una raccolta, a seconda dello stato del Garbage Collector. Il metodo Collect(Int32, GCCollectionMode, Boolean) richiede una raccolta in background, la cui esecuzione non è comunque garantita. A seconda della situazione, può venire comunque eseguita una raccolta di blocco. Il Garbage Collector tenta di garantire prestazioni ottimali. Se è già in corso una raccolta in background, il metodo viene restituito immediatamente.

Vedi anche