J'essaie de résoudre certains problèmes de fuite de mémoire dans une application, et j'espère vraiment que quelqu'un ici pourra m'offrir quelques idées qui aideront. J'ai bricolé avec ça toute la journée et j'ai peur d'être complètement coincé.Qu'est-ce qui cause ma fuite de mémoire C# .NET, dans une application qui est inactive?
L'application que je suis en train de dépanner fonctionne correctement au début, mais deviendra lente et peut-être même tomber en panne si elle est utilisée après s'être arrêtée pendant quelques heures. Je suppose que cela est dû à une sorte de fuite de mémoire qui s'aggrave avec le temps. Autant que je sache, il n'y a pas de processus internes, tels que des minuteurs ou des boucles sans fin, etc., qui peuvent expliquer la fuite de mémoire, mais les symptômes sont reproductibles, donc quelque chose se passe définitivement.
Afin de tenter de résoudre ce problème, j'ai téléchargé et installé une version d'essai de .NET Memory Profiler. Malheureusement, je ne sais pas trop comment interpréter les résultats que je reçois. Pour autant que je sache, les classes qui me semblent les plus problématiques sont les classes système, telles que System.Version et System.Object []. Je pense ceci basé sur l'hypothèse que les «données à rechercher» sont le nombre d'instances et d'octets inaccessibles signalés par le profileur.
Voici quelques exemples de données, semblable à ce que j'ai été voir:
- Espace de noms: Système
- Nom de la classe: Version
- instances Live ...
- Total: 2
- Delta: 0
- Live Octets ...
- Total: 48
- Nouveau: 48
- Max: 24
- Delta: 0
- ... injoignables
- instances: 15556
- Octets: 373.344
- Espace de noms: système
- Nom de la classe: Object []
- instances Live ...
- Total: 1198
- Delta: 0
- Bytes en direct ...
- Total: 117.916
- Nouveau: 117.916
- Max: 7,016
- Delta: 0
- inaccessible ...
- instances: 3054
- Octets: 204.592
Si je lis ce droit, les deux plus grands problèmes que je fais face est que j'ai plus de 15 000 cas de versions d'assemblage et de plus de 3000 objets sont «inaccessibles», bien que je ne sois pas sûr de ce que l'on entend par «inaccessible».
Donc, mes questions spécifiques sont les suivants:
- Quelqu'un peut-il me dire si je lis correctement les données Profiler mémoire .Net?
- Si je lis correctement les données, qu'est-ce qui pourrait amener mon application à générer plus d'instances de version d'assembly et plus d'instances d'objet alors qu'aucun utilisateur final n'interagit avec elle?
Avez-vous essayé, alors qu'il est vraiment lent, juste en appuyant sur le bouton de pause à quelques reprises? Avec de la chance, ça vous dira ce que c'est. –
Aucune preuve réelle d'une fuite de mémoire, ici. Je soupçonne que votre hypothèse initiale est erronée. –