Fuites de mémoire dans C# WPF
je pourrais avoir besoin de quelques conseils pour trouver la cause des fuites de mémoire dans C#. Je comprends ce qu'est une fuite de mémoire et je comprends pourquoi ils se produisent en C# mais je me demande quels outils/stratégies avez-vous utilisé dans le passé pour les résoudre?
j'utilise le profileur de mémoire .NET et j'ai découvert que l'un de mes énormes objets principaux reste en mémoire après que j'ai fermé la fenêtre qu'il gère mais je ne suis pas sûr de ce qu'il faut faire pour renforcer tous les liens vers lui.
Si je ne suis pas du être assez clair juste après une réponse avec une question et je vais éditer ma question en réponse. Merci!
2 réponses
enfoncez le débogueur et tapez ceci dans la fenêtre immédiate:
.load C:\Windows\Microsoft.NET\Framework\v2.0.50727\sos.dll
le chemin vers sos.dll varie. La façon de trouver le bon chemin est de chercher mscorwks.dll dans le volet des Modules. Quel que soit l'endroit où il est chargé, c'est le chemin correct pour sos.DLL.
alors tapez ceci:
System.GC.Collect()
Qui va assurer ce qui n'est pas accessible collectées. Puis tapez ceci:
!DumpHeap -type <some-type-name>
ceci vous montrera un tableau de toutes les instances existantes, avec adresse. Vous pouvez trouver ce qui maintient une instance vivante comme ceci:
!gcroot <some-address>
.net Memory Profiler est un excellent outil, et que j'utilise fréquemment pour diagnostiquer les fuites de mémoire dans les applications WPF.
comme je suis sûr que vous le savez, une bonne façon de l'utiliser est de prendre un snapshot avant d'utiliser une fonctionnalité particulière, puis de prendre un second snapshot après l'avoir utilisé, fermer la fenêtre, etc. En comparant les deux instantanés, vous pouvez voir combien d'objets d'un certain type sont alloués mais pas libérés: c'est une fuite.
après double-clic sur un type, le profileur vous montrera les chemins racine les plus courts gardant les objets de ce type vivants. Les objets .NET peuvent fuir de nombreuses façons dans WPF, donc afficher le chemin racine que vous voyez devrait aider à identifier la cause ultime. En général, cependant, essayez de comprendre pourquoi ces objets s'accrochent à votre objet, et voyez s'il y a un moyen de détacher vos gestionnaires d'événements, les fixations, etc. lorsque la fenêtre est fermée.
j'ai récemment posté un blog l'entrée sur un fuite de mémoire qui peut être causé par certains reliures; pour ce type spécifique de fuite, le code est utile pour trouver la reliure qui est fautive.