2010-02-13 3 views
3

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:

  1. 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
  2. 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?
+2

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. –

+0

Aucune preuve réelle d'une fuite de mémoire, ici. Je soupçonne que votre hypothèse initiale est erronée. –

Répondre

5

Il n'y a aucune preuve réelle d'une fuite de ce que vous avez posté. Le garbage collector n'a pas fonctionné pendant un moment, c'est normal sur un programme inactif. Les 0,5 Mo que ces objets non collectés prennent sont des cacahuètes. Ce qui se passera lorsqu'un programme est inactif pendant un certain temps, c'est que ses pages de mémoire virtuelle seront permutées dans le fichier d'échange. Une fois la mise au point rétablie, ces pages doivent être réinsérées. Lorsque la machine est vieille, cela peut prendre un certain temps. Votre vrai problème est plus que probablement la fragmentation du disque, en particulier sur le fichier d'échange.

Vous devriez être capable de dire à partir de la lumière d'accès du disque dur, il doit clignoter furieusement. Vous pouvez également dire à partir de TaskMgr.exe, onglet Traiter. Afficher + Sélectionner les colonnes, cochez la case Faute Delta. Ce nombre devrait aller à zéro dans une seconde ou moins après la restauration de la fenêtre du programme.

Défragmentez votre disque. Surtout le fichier d'échange, ce qui est difficile à faire. Posez des questions à ce sujet sur superuser.com

+0

il ya un utilitaire que vous pouvez obtenir appelé pagedefrag qui défragmente le fichier d'échange ... http: //technet.microsoft.com/en-us/sysinternals/bb897426.aspx – t0mm13b

+0

C'est bon, mais n'a pas été mis à jour depuis un moment . Ne fonctionne pas dans Win7, pour un. –

Questions connexes