Mon application vient de divulguer 1,5 Go de mémoire. Je suppose que puisque je n'ai pas une tonne de données à ma disposition, je suppose qu'il y a une fuite de mémoire, mais ça pourrait aussi être juste tenir dessus. Je suis actuellement en train d'utiliser perfmon pour recueillir autant d'informations que possible, pour essayer de comprendre ce qui pourrait causer le problème. Je n'ai pas beaucoup de pistes à ce stade, et j'espérais obtenir plus d'indices de la part des gens ici.Déboguer une énorme fuite de mémoire dans l'application
La première chose que je peux dire est que je n'implémente pas IDisposable dans aucune de mes classes. Cependant, je sais que je n'appelle Dispose sur aucun des éléments GUI, comme SolidColorBrush. Comme mon application n'est pas très gourmande en graphiques, je pense que cela ne peut pas causer le problème. Cependant, je vais ajouter les appels nécessaires.
Je ne sais pas si j'utilise d'autres classes dans le framework implémentant IDisposable. J'ai lu un article here on SO sur FxCop. Je l'ai installé et utilisé pour analyser mon assemblage, mais il semble vérifier seulement l'implémentation correcte de mes propres classes d'IDisposable. Existe-t-il un autre outil qui peut me dire TOUTES les classes qui implémentent IDisposable? J'utilise actuellement WF dans mon application, et les WF sont constamment lancés et terminés. Perfmon montre que les fichiers WF se terminent correctement, et j'utilise le mot-clé "using", qui, d'après ce que je comprends, traite de l'élimination appropriée pour moi.
Existe-t-il un moyen simple de savoir si la "fuite" de la mémoire provient d'un code non géré ou géré?
L'application utilisait 77k + poignées au moment où j'ai reçu l'exception MOO.
Des conseils sur la façon de procéder ensuite seraient grandement appréciés. Je prévois de redémarrer l'application et de surveiller les compteurs de performance, et peut-être de supprimer certains appels. Je peux aussi lancer la simulation pour des raisons de comparaison, car dans ce mode, elle ne va pas appeler ma DLL C.
Je viens également d'installer et de faire fonctionner le profileur CLR, et il semble ne jamais vraiment s'attacher à mon processus. Il lance mon application, mais la fenêtre qui dit "attendre l'application pour lancer le Common Language Runtime" reste à l'écran pour toujours. Lorsque je ferme mon application, elle est toujours là. Alors peut-être que ça ne marche pas avec .NET 3.5 après tout. – Dave
Fonctionne avec .NET 3.5. –
J'ai eu ce problème avant aussi, je pense que la solution était de l'exécuter en tant qu'administrateur. –