2010-01-28 6 views
2

J'essaie de profiler une page spécifique de mon site ASP.NET pour optimiser l'utilisation de la mémoire, mais la nature de .NET en tant que langage Garbage Collected rend difficile l'obtention d'une image réelle de la façon dont la mémoire est utilisée et libérée le programme.Quel compteur puis-je utiliser dans le moniteur de performances pour voir combien de mémoire attend le GC?

Existe-t-il un compteur Perfmon ou une autre méthode de profilage qui me permette de voir non seulement combien de mémoire est allouée, mais aussi combien a été libéré par le programme et n'attend que la récupération de place?

Répondre

2

En fait, rien dans la machine ne sait vraiment ce qui est en attente de garbage collection: la collecte des ordures est précisément le processus de chiffrer et de libérer la mémoire correspondant aux objets morts. Au mieux, le GC n'aura cette information que sur quelques instants très spécifiques de son cycle. Les parties de détection et de relâchement sont souvent entrelacées (cela dépend de la technologie GC), il est donc possible que le GC n'ait jamais un compte complet de ce qui pourrait être libéré.

Pour la plupart des GC, l'obtention d'une telle information est coûteuse en calcul. Si vous êtes prêt à y consacrer un peu de temps CPU (cela ne sera pas transparent pour l'application), vous pouvez utiliser GC.Collect() pour forcer l'exécution du GC, immédiatement suivi d'un appel à GC.GetTotalMemory() pour savoir combien de mémoire a survécu GC. Notez que forcer le CPG peut induire une pause notable et peut également réduire les performances globales.

Ceci est la méthode "maison"; pour une analyse plus sérieuse, essayez un profileur dédié.

+0

GC.Collect() assure-t-il vraiment que GC fonctionnera? –

2

La meilleure façon que j'ai été capable de profiler la mémoire est d'utiliser ANTS Profiler de RedGate. Vous pouvez afficher un instantané, à quel stade du cycle de vie il se trouve et plus encore. Y compris les valeurs d'objet réelles.