DA0018 : application 32 bits s'exécutant aux limites de la mémoire managée du processus
ID de la règle |
DA0018 |
Catégorie |
Utilisation des outils de profilage |
Méthode de profilage |
Échantillonnage |
Message |
Les allocations de mémoire managée sont proches de la limite pour un processus 32 bits.Votre application peut être liée à la mémoire. |
Type de règle |
Avertissement |
Lorsque vous profilez en utilisant les méthodes d'échantillonnage, de mémoire. NET ou de conflits de ressources, vous devez collecter au moins 10 échantillons pour déclencher cette règle.
Cause
Les données système collectées pendant l'exécution du profilage indiquent que les tas de mémoire .NET Framework ont approché de la taille maximale autorisée pour les tas managés dans un processus 32 bits.Cette taille maximale est une valeur par défaut.Elle est basée sur la quantité totale de l'espace d'adressage du processus qui peut être allouée pour les octets privés.La valeur signalée représente la valeur maximale observée des tas pendant que le processus profilé était actif.Considérez un nouveau profilage à l'aide de la méthode des profils de mémoire .NET et une optimisation de l'utilisation des ressources managées par l'application.
Lorsque la taille des tas managés approche de la limite par défaut, le processus de garbage collection automatique devra peut-être être plus fréquemment appelé.Cela augmente la surcharge de gestion de la mémoire.
La règle se déclenche seulement pour les applications 32 bits qui s'exécutent sur des ordinateurs 32 bits.
Description de la règle
Le CLR (Common Language Runtime) Microsoft.NET offre un mécanisme de gestion automatique de la mémoire qui utilise un garbage collector pour libérer la mémoire des objets que l'application n'utilise plus.Le garbage collector est orienté génération, basé sur l'hypothèse que de nombreuses allocations ont une courte durée de vie.Les variables locales, par exemple, doivent avoir une courte durée de vie.Les objets nouvellement créés commencent à la génération 0 (gen 0),puis progressent jusqu'à la génération 1 lorsqu'ils survivent à une exécution de garbage collection et effectuent enfin une transition vers la génération 2 si l'application les utilise encore.
Les objets managés supérieurs à 85 Ko sont alloués sur le tas des objets volumineux, où ils sont soumis à un garbage collection et un compactage moins fréquents que les objets plus petits.Les objets volumineux sont gérés séparément car ils sont considérés plus persistants et parce que le fait de mélanger des objets volumineux persistants avec des plus petits objets fréquemment alloués peut entraîner une grave fragmentation du tas.
Lorsque la taille totale des tas managés approche de la limite par défaut, la surcharge de gestion de la mémoire augmente généralement jusqu'à une possible affectation de la réactivité et de l'extensibilité de l'application.
Comment examiner un avertissement
Double-cliquez sur le message dans la fenêtre Liste d'erreurs pour naviguer jusqu'à l'affichage Marques.Recherchez les colonnes Mémoire CLR .NET\Nombre d'octets dans tous les tas et Nombre total d'octets validés.Déterminez s'il existe des phases spécifiques d'exécution du programme où l'allocation de mémoire managée est plus importante que d'autres phases.Comparez les valeurs de la colonne Nombre d'octets dans tous les tas au taux de garbage collection signalé dans les colonnes Mémoire CLR .NET\Nombre de collections de la génération 0, Mémoire CLR .NET\Nombre de collections de la génération 1 et Mémoire CLR .NET\Nombre de collections de la génération 2 pour déterminer si le modèle des allocations de mémoire managée affecte le taux de garbage collection.
Dans une application .NET Framework, le CLR limite la taille totale des tas managés à légèrement moins de la moitié de la taille maximale de la partie de zone privée d'un espace d'adressage de processus.Pour les processus 32 bits qui s'exécutent sur un ordinateur 32 bits, 2 Go représente la limite supérieure de la partie privée de l'espace d'adressage du processus.Lorsque la taille totale des tas managés commence à approcher de sa limite par défaut, la surcharge de gestion de la mémoire peut augmenter et la performance de l'application peut diminuer.
Si la surcharge excessive de la mémoire managée pose un problème, considérez l'une ou l'autre de ces options :
optimisation de l'utilisation de l'application de ressources mémoire managées
ou
prise de mesures pour soulager les contraintes architecturales de taille maximale de mémoire virtuelle pour un processus 32 bits
Pour optimiser l'utilisation de l'application de ressources mémoire managées, rassemblez les données d'allocation de mémoire managée dans une exécution de profilage d'Allocation de mémoire .NET.Examinez les rapports Vues de données de mémoire .NET des outils de profilage pour comprendre le modèle d'allocation de mémoire de l'application.
Utilisez le Mode Durée de vie de l'objet pour déterminer quels sont les objets de données du programme qui survivent dans la génération et qui sont ensuite libérés.
Utilisez l'Mode Allocations de mémoire .NET pour déterminer le chemin d'exécution ayant entraîné ces allocations.
Pour plus d'informations sur l'amélioration des performances du garbage collection, consultez l'article technique du .NET Framework : Notions de base et conseils de performance relatifs au Garbage Collector (page éventuellement en anglais) sur le site MSDN.
Pour un assouplissement des contraintes architecturales de mémoire virtuelle sur la taille de la partie privée d'un espace d'adressage de processus, essayez d'exécuter ce processus 32 bits sur un ordinateur 64 bits.Un processus 32 bits sur un ordinateur 64 bits peut acquérir jusqu'à 4 Go de mémoire virtuelle privée.
Un processus 64 bits exécuté sur un ordinateur 64 bits peut acquérir jusqu'à 8 To de mémoire virtuelle privée.Envisagez de re-compiler l'application pour une exécution en tant qu'application 64 bits native.Cette règle est fournie uniquement à titre d'information et peut ne pas exiger d'action corrective.