Modes de latence
Pour récupérer des objets, le récupérateur de mémoire doit arrêter tous les threads en cours d'exécution dans une application. La période pendant laquelle le récupérateur de mémoire est actif est appelé latence.
Dans certaines situations, par exemple, quand une application récupère des données ou affiche du contenu, un garbage collection complet peut se produire à un moment critique et nuire aux performances. Vous pouvez ajuster le niveau d'intrusion du garbage collector en définissant la propriété GCSettings.LatencyMode sur l'une des valeursSystem.Runtime.GCLatencyMode.
Paramètres à faible latence
L’utilisation d’un paramètre de latence « faible » signifie que le récupérateur de mémoire intrus est inférieur à votre application. La récupération de mémoire est plus conservatrice sur la récupération de la mémoire.
L'énumération System.Runtime.GCLatencyMode fournit deux paramètres de latence faible :
GCLatencyMode.LowLatency supprime les collections de génération 2 et effectue uniquement des collections de génération 0 et 1. Elle ne peut être utilisée que pour de courtes durées. Sur des périodes plus longues, si le système connaît une sollicitation de mémoire importante, le garbage collector déclenchera une collection, qui pourra brièvement suspendre l'application et interrompre une opération critique. Ce paramètre est disponible uniquement pour le garbage collection des stations de travail.
GCLatencyMode.SustainedLowLatency supprime les collections de génération 2 de premier plan et effectue uniquement des collections de génération 0 et 1, ainsi que des collections de génération 2 d’arrière-plan. Il peut être utilisé pour de longues périodes et est disponible à la fois pour le garbage collection des stations de travail et des serveurs. Ce paramètre ne peut pas être utilisé si la récupération de mémoire simultanée est désactivée.
Pendant les périodes de faible latence, les collections de génération 2 sont empêchées, sauf dans les cas suivants :
Le système reçoit une notification de mémoire insuffisante du système d'exploitation.
Le code de votre application déclenche une collection en appelant la méthode GC.Collect et en spécifiant la valeur 2 pour le paramètre
generation
.
Scénarios
Le tableau suivant répertorie les scénarios d'application pour l'utilisation des valeurs GCLatencyMode :
Mode de latence | Scénarios d’application |
---|---|
Batch | Pour les applications qui n'ont aucune interface utilisateur ou les opérations côté serveur. Lorsque la récupération de mémoire en arrière-plan est désactivée, il s’agit du mode par défaut pour la station de travail et la récupération de mémoire de serveurs. Le mode Batch remplace également le paramètre gcConcurrent, autrement dit, empêche les regroupements en arrière-plan ou simultanés. |
Interactive | Pour la plupart des applications qui ont une interface utilisateur. Il s’agit du mode par défaut pour la récupération de mémoire de stations de travail et de serveur. Toutefois, si une application est hébergée, les paramètres de la récupération de mémoire du processus d’hébergement sont prioritaires. |
LowLatency | Pour les applications qui ont des opérations de courte durée pour lesquelles le temps est important, et durant lesquelles les interruptions du garbage collector pourraient provoquer des perturbations. Par exemple, les applications qui affichent des animations ou des fonctions d’acquisition de données. |
SustainedLowLatency | Pour les applications qui ont des opérations pour lesquelles le temps est important, pendant une durée définie mais potentiellement longue durant laquelle les interruptions du garbage collector pourraient provoquer des perturbations. Par exemple, les applications nécessitant des temps de réponse rapides en raison du changement des données de marché pendant les heures de négociation. Ce mode augmente davantage la taille du tas managé que les autres modes. Parce qu'il ne compacte pas le tas managé, une fragmentation plus importante est possible. Assurez-vous que suffisamment de mémoire est disponible. |
Instructions sur l'utilisation de la faible latence
Quand vous utilisez le mode GCLatencyMode.LowLatency, respectez les consignes suivantes :
Choisissez une période aussi courte que possible pour la faible latence.
Évitez d'allouer de grandes quantités de mémoire pendant les périodes de faible latence. Vous pouvez recevoir des notifications de mémoire insuffisante, car le garbage collection récupère moins d'objets.
En mode de latence faible, réduisez le nombre d'allocations, notamment les allocations sur le tas des objets volumineux et les objets épinglés.
N'oubliez pas les threads qui peuvent être à l'origine d'allocations. Étant donné que le paramètre de propriété LatencyMode est à l’échelle du processus, les exceptions OutOfMemoryException peuvent être générées sur n’importe quel thread qui alloue.
Encapsulez le code à faible latence dans les régions d’exécution contraintes. Pour plus d’informations, consultez Régions d’exécution contraintes.
Vous pouvez forcer les collections de génération 2 pendant une période de latence basse en appelant la méthode GC.Collect(Int32, GCCollectionMode).