Modalità di latenza
Per recuperare oggetti, tramite il Garbage Collector (GC) devono essere arrestati tutti i thread in esecuzione in un'applicazione. Il periodo di tempo durante il quale il Garbage Collector è attivo viene definito latenza.
In alcune situazioni, ad esempio quando un'applicazione recupera dati o visualizza contenuto, un'operazione completa di Garbage Collection può verificarsi in un momento critico e può ostacolare le prestazioni. È possibile rettificare l'ingerenza del Garbage Collector impostando la proprietà GCSettings.LatencyMode su uno dei valori System.Runtime.GCLatencyMode.
Impostazioni bassa latenza
L'uso di un'impostazione di latenza "bassa" significa che il Garbage Collector accede all'applicazione con una minore frequenza. Relativamente alla richiesta di memoria, Garbage Collection è più conservativo.
Tramite l'enumerazione System.Runtime.GCLatencyMode vengono fornite due impostazioni a bassa latenza:
GCLatencyMode.LowLatency elimina le raccolte di generazione 2 ed esegue solo le raccolte di generazione 0 e 1. Può essere usato solo per brevi periodi di tempo. In caso di lunghi periodi, se viene usata una quantità elevata di memoria, tramite il Garbage Collector verrà attivata una raccolta mediante la quale è possibile mettere in pausa brevemente l'applicazione e interrompere un'operazione critica rispetto al tempo. Questa impostazione è disponibile solo per le operazioni di Garbage Collection per workstation.
GCLatencyMode.SustainedLowLatency elimina le raccolte di generazione 2 in primo piano ed esegue solo le raccolte di generazione 0, 1 e di generazione 2 in background. Può essere usato per periodi di tempo più lunghi ed è disponibile per le operazioni di Garbage Collection per workstation e per server. Questa impostazione non può essere usata se l'operazione di Garbage Collection in background è disabilitata.
Durante i periodi di bassa latenza, le raccolte di generazione 2 vengono soppresse eccetto nei seguenti casi:
Il sistema riceve una notifica di memoria insufficiente dal sistema operativo.
Il codice dell'applicazione induce una collection chiamando il metodo GC.Collect e specificando 2 per il parametro
generation
.
Scenari
Nella tabella seguente sono elencati gli scenari di applicazioni per utilizzare i valori GCLatencyMode:
Modalità di latenza | Scenari applicativi |
---|---|
Batch | Per applicazioni che non hanno interfaccia utente (UI) o operazioni lato server. Quando Garbage Collection in background è disabilitata, questa è la modalità predefinita per Garbage Collection della workstation e del server. La modalità Batch esegue anche l'override dell'impostazione gcConcurrent, ovvero impedisce raccolte in background o simultanee. |
Interactive | Per la maggior parte delle applicazioni che hanno una interfaccia utente. Questa è la modalità predefinita per Garbage Collection della workstation e del server. Tuttavia, se è ospitata un'app, le impostazioni di Garbage Collector del processo host hanno la precedenza. |
LowLatency | Per le applicazioni con operazioni a breve termine, per cui il tempo riveste un'importanza significativa, durante le quali le interruzioni del Garbage Collector potrebbero rivelarsi dannose. Ad esempio, applicazioni che eseguono il rendering di animazioni o funzioni di acquisizione dei dati. |
SustainedLowLatency | Per le applicazioni con operazioni per cui i tempi sono importanti per una durata contenuta, ma potenzialmente lunga, durante la quale le interruzioni del Garbage Collector potrebbero rivelarsi dannose. Ad esempio, le applicazioni per cui sono richiesti tempi di risposta rapidi come i cambiamenti dei dati di mercato durante le ore di negoziazione. Questa modalità comporta dimensioni dell'heap gestito maggiori rispetto ad altre. Poiché non consente di comprimere l'heap gestito, è possibile avere una maggiore frammentazione. Assicurarsi che sia disponibile memoria sufficiente. |
Linee guida per l'uso della bassa latenza
Quando si usa la modalità GCLatencyMode.LowLatency, tenere in considerazione le linee guida seguenti:
Mantenere il periodo di tempo in bassa latenza più brevemente possibile.
Evitare di allocare quantità di memoria elevate durante i periodi di bassa latenza. Possono verificarsi notifiche di memoria insufficiente perché le operazioni di Garbage Collection recuperano meno oggetti.
In modalità di bassa latenza, ridurre al minimo il numero delle nuove allocazioni, in particolare le allocazioni su large object heap e oggetti bloccati.
Tenere presenti i thread che potrebbero essere in corso di allocazione. Poiché l'impostazione della proprietà LatencyMode è a livello di processo, è possibile generare le eccezioni OutOfMemoryException in qualsiasi thread in corso di allocazione.
Eseguire il wrapping del codice a bassa latenza nelle aree di esecuzione vincolate. Per altre informazioni, vedere Aree di esecuzione vincolate.
È possibile forzare le operazioni di Garbage Collection di generazione 2 durante un periodo di bassa latenza chiamando il metodo GC.Collect(Int32, GCCollectionMode).