Quelles stratégies et quels outils sont utiles pour trouver les fuites de mémoire dans .NET?
J'ai écrit en C++ pour 10 ans. J'ai rencontré des problèmes de mémoire, mais ils pourraient être fixés avec une quantité raisonnable de l'effort.
Pour les deux dernières années, j'ai écrit en C#. Je trouve que je reçois encore beaucoup de problèmes de mémoire. Elles sont difficiles à diagnostiquer et à résoudre en raison de la non-determinancy, et parce que le C# philosophie est que vous ne devriez pas avoir à vous soucier de ces choses quand vous avez très certainement le faire.
Un problème particulier je trouve, c'est que j'ai explicitement disposer de nettoyage et de tout ce qui dans le code. Si je ne le fais pas, les profileurs de mémoire n'ont pas vraiment aider, car il y a beaucoup de pellicules, flottant sur vous ne pouvez pas trouver une fuite au sein de toutes les données qu'ils essaient de vous le montrer. Je me demande si j'ai eu la mauvaise idée, ou si l'outil que j'ai reçu n'est pas le meilleur.
Ce genre de stratégies et d'outils sont utiles pour lutter contre les fuites de mémoire dans .NET?
- Le titre de la vous post ne correspond pas vraiment à la question dans ton post. Je vous suggère de mettre à jour votre titre.
- Vous avez raison. Désolé, j'ai été un peu marre de la fuite de courant, je suis à la chasse! Titre mis à jour.
- Ne pas être assez .NET, il n'est pas le problème. Votre code est.
- Yep, mon code, ou le tiers des bibliothèques, j'ai le plaisir de l'utiliser.
- Voir ma réponse. MemProfiler en vaut la peine. Son utilisation permettra également de vous donner un tout nouveau niveau de compréhension de l' .NET GC monde.
- J'ai trouvé quelques vraiment bons articles qui ont été utile pour moi quand on regarde les problèmes de mémoire dans .NET et j'ai gardé une référence pour eux donc je les avoir autour. Débogage des Problèmes de Mémoire (en anglais) les Outils de Débogage pour Windows Débogage SOS Extensions ils ont tous été très utile. Je viens d'une C++ arrière-plan, trop donc je sais ce que tu veux dire. À la fin, il y a beaucoup de chevauchement dans les outils que vous utilisez pour lo
- Vous voudrez peut-être vérifier dotTrace par JetBrains (créateurs de Resharper). Outil fantastique! jetbrains.com/profiler
- vous pouvez utiliser deleaker - bon outil pour le débogage des fuites de mémoire...
- Désolé pour amener une vieille question, mais pourquoi, OP dire: "C# philosophie est que vous ne devriez pas avoir à vous soucier de ces choses"
- En tant que programmeur C++ à C#, j'ai appris que C# est des ordures collectées et que la mémoire inutilisée doit être automatiquement renvoyé à l'OS. Dans la documentation, j'ai lu à l'époque, il semblait que cet état d'esprit a été promu, et en effet, avec relativement peu de C# apps, vous pouvez la sortir avec la pensée comme ça.
Vous devez vous connecter pour publier un commentaire.
- Je utiliser Scitech du MemProfiler lorsque je soupçonne une fuite de mémoire.
Jusqu'à présent, j'ai trouvé qu'il est très fiable et puissant. Il a sauvé ma bacon sur au moins une occasion.
La GC qui fonctionne très bien .NET de l'OMI, mais comme toute autre langue ou la plate-forme, si vous écrivez un mauvais code, les mauvaises choses se produisent.
Juste pour l'oublier-à-éliminer le problème, essayez de la solution décrite dans ce post de blog. Voici l'essence:
Nous avons utilisé Ants Profiler Pro par logiciel de Porte Rouge dans notre projet. Cela fonctionne vraiment bien pour tous .NET de la langue en fonction des applications.
Nous avons constaté que les .NET Garbage Collector est très "safe" dans son le nettoyage des objets en mémoire (comme il faut). Il serait de garder les objets autour juste parce que nous pourrait de l'utiliser dans le futur. Cela signifiait que nous devions être plus prudent sur le nombre d'objets que nous avons gonflé dans la mémoire. En fin de compte, nous avons converti l'ensemble de nos objets de données de plus de à un "gonfler à la demande" (juste avant un champ est demandé) afin de réduire la surcharge de la mémoire et améliorer les performances.
EDIT: Voici une explication plus détaillée de ce que je veux dire par "gonfler à la demande." Dans notre modèle d'objet de notre base de données nous utilisons les Propriétés d'un objet parent pour exposer l'objet enfant(s). Par exemple, si nous avons eu quelques record qui faisait référence à un autre "détail" ou "recherche" enregistrement sur un un-à-un, nous permettrait de structure comme ceci:
Nous avons constaté que le système ci-dessus créé certains réel de la mémoire et des problèmes de performances lorsque il y avait un grand nombre d'enregistrements dans la mémoire. Nous avons donc opté pour un système où les objets étaient gonflés que lorsqu'elles ont été demandées, et de la base de données des appels ont été effectués uniquement lorsque c'est nécessaire:
Ce qui s'est avéré être beaucoup plus efficace parce que les objets étaient conservés hors de la mémoire jusqu'à ce qu'ils ont besoin (la méthode Get a été consulté). Il a fourni un très gros gain de performances dans la limitation de la base de données de frappe et un énorme gain d'espace mémoire.
Vous avez encore besoin de s'inquiéter à propos de la mémoire lorsque vous écrivez du code managé à moins que votre application est trivial. Je vais vous suggérer deux choses: tout d'abord, lisez CLR via C#, car il va vous aider à comprendre la gestion de la mémoire dans .NET. Deuxièmement, apprendre à utiliser un outil comme CLRProfiler (Microsoft). Cela peut vous donner une idée de ce qui est à l'origine de votre fuite de mémoire (par exemple, vous pouvez prendre un coup d'oeil à votre grand objet de la fragmentation des segments)
Êtes-vous à l'aide de code non managé? Si vous n'utilisez pas le code non managé, selon Microsoft, les fuites de mémoire dans le sens traditionnel du terme, ne sont pas possibles.
Mémoire utilisée par une application ne peut pas être libéré toutefois, si une demande d'allocation de mémoire peut croître tout au long de la vie de l'application.
Pour traiter ce type de problème, vous pouvez mettre en œuvre IDisposable. Si vous voulez voir quelques-uns des stratégies pour faire face à la gestion de la mémoire, je suggère à la recherche pour IDisposable, XNA, gestion de la mémoire que les développeurs de jeux ont besoin d'avoir de plus en plus prévisible de collecte des ordures et il faut donc en vigueur le GC pour faire sa chose.
Une erreur courante est de ne pas supprimer des gestionnaires d'événements qui s'abonnent à un objet. Un gestionnaire d'événements abonnement permettra d'éviter un objet d'être recyclés. Aussi, jetez un oeil à la à l'aide de déclaration qui vous permet de créer un champ d'application limité pour une ressource de la vie.
Ce blog a vraiment merveilleux procédures pas à pas à l'aide de windbg et d'autres outils pour traquer les fuites de mémoire de tous les types. Une excellente lecture pour développer vos compétences.
J'ai juste eu une fuite de mémoire dans un service windows, que j'ai fixé.
Tout d'abord, j'ai essayé MemProfiler. Je l'ai trouvé très difficile à utiliser et pas du tout convivial.
Ensuite, j'ai utilisé JustTrace qui est plus facile à utiliser et vous donne plus de détails sur les objets qui ne sont pas éliminés correctement.
Il m'a permis de résoudre la fuite de mémoire très facilement.
Si les fuites que vous observez sont dus à une perte de contrôle de cache de la mise en œuvre, c'est un scénario où vous pourrait envisager l'utilisation de WeakReference. Cela pourrait aider à s'assurer que la mémoire est libérée lorsque nécessaire.
Cependant, à mon humble avis, il serait préférable d'envisager une solution sur mesure - seulement vous vraiment savoir combien de temps vous avez besoin pour garder les objets, de sorte que la conception de ménage appropriés code de votre situation est généralement la meilleure approche.
Je préfère dotmemory de Jetbrains
Gros canons - Les Outils de débogage pour Windows
C'est une incroyable collection d'outils. Vous pouvez analyser tous deux gérés et non gérés tas avec elle et vous pouvez le faire en mode hors connexion. C'était très pratique pour le débogage de l'un de nos ASP.NET les applications qui ont gardé le recyclage en raison de la mémoire de la surutilisation. Je n'avais qu'à créer une image mémoire complète de la vie processus en cours d'exécution sur le serveur de production, toute l'analyse a été faite en mode hors connexion dans WinDbg. (Il s'est avéré que certains développeurs était la surutilisation de Session en mémoire de stockage.)
"En cas de bris, il est..." blog est très utile d'articles sur le sujet.
La meilleure chose à garder à l'esprit est de garder la trace des références à vos objets. Il est très facile de se retrouver avec la pendaison de références à des objets que vous ne se soucient pas plus.
Si vous n'allez pas utiliser quelque chose de plus, de se débarrasser de lui.
De s'habituer à l'aide d'un fournisseur de cache avec le glissement de l'expiration, de sorte que si quelque chose n'est pas référencé pour l'heure souhaitée de la fenêtre il est déréférencé et nettoyé. Mais si il est possible d'accéder à un lot, il va dire dans la mémoire.
L'un des meilleurs outils est à l'aide de la Les Outils de débogage pour Windows, et un vidage de mémoire du processus à l'aide adplus, puis utilisez windbg et la sos plugin pour analyser le processus de la mémoire, threads, et les piles d'appels.
Vous pouvez utiliser cette méthode pour l'identification des problèmes sur les serveurs aussi, après l'installation de ces outils, partager le répertoire, puis connectez-vous à l'action à partir du serveur à l'aide de (net use) et de prendre un crash ou de vidage de blocage du processus.
Puis analyser en mode hors connexion.
Après l'un de mes correctifs pour les applications gérés j'ai eu la même chose, par exemple, comment vérifier que ma demande n'aura pas la même fuite de mémoire après mon prochain changement, donc j'ai écrit quelque chose comme Objet de Libération cadre de Vérification, veuillez jeter un coup d'oeil sur le package NuGet ObjectReleaseVerification. Vous pouvez trouver un exemple ici https://github.com/outcoldman/OutcoldSolutions-ObjectReleaseVerification-Sample, et de l'information à propos de cet exemple http://outcoldman.ru/en/blog/show/322
À partir de Visual Studio 2015 envisager d'utiliser de la boîte Utilisation de la Mémoire de l'outil de diagnostic pour recueillir et analyser l'utilisation de la mémoire de données.
L'Utilisation de la Mémoire de l'outil vous permet de prendre une ou plusieurs des instantanés de la géré et natif du segment de mémoire pour aider à comprendre l'utilisation de la mémoire de l'impact des types d'objet.