8
votes

Collecteur de poubelles .NET - Voir ce qui est promu au Gen2 pendant l'exécution

Mon programme fait la promotion de la mémoire à GEN2 à un taux très élevé (environ 1 Mo / s) et il provoque un coup de performance lorsque la collecte GEN2 se produit. Chaque tentative que j'ai faite pour comprendre quels objets ont été favorisés échoués - principalement en raison du fait que lorsque j'ai ouvert 2 décharges dans Windbg, la mémoire à partir de laquelle l'augmentation de la taille de GEN2 était composée, était marquée comme "libre". Cela m'a amené à soupçonner que les objets épinglés causent le problème, mais les statistiques de Perfmon montrent que le nombre d'objets épinglés est très faible (environ 2-4).

Ce que je pense essayer d'essayer maintenant est d'identifier d'une manière ou d'une autre quels objets sont promus au GEN2 en runtime. Y a-t-il une méthode pour faire cela?


2 commentaires

Je soupçonne que vous ne disposez pas d'objets jetables. Les objets les plus non déconposés vont courir leur finisseur et disposeront de là. Finaliseurs bloquer GC Collection SE SECTION "Comment la finalisation affecte la collection" .


Allouons-vous des gros objets? Les objets Afaik alloués sur le grand heap objet vont à Gen 2 immédiatement.


4 Réponses :


5
votes

Vous pouvez utiliser WINDBG pour déboguer de tels problèmes. Définissez un point d'arrêt sur la routine de collecte des ordures, examinez le tas géré, laissez la collection à la poubelle survoir, puis examinez à nouveau le tas géré pour voir quels objets sont actuellement dans Gen2.

Voici quelques liens pour commencer avec:

Suivi des fuites de mémoire gérées

Comment itération sur le objets présents dans le tas de .NET géré?

Tess Ferrandez 'Blog

Enquête sur la gestion de la mémoire .NET et la collecte des ordures

Désolé que ce n'est pas une réponse directe et détaillée à votre question, mais cela devrait vous donner un point de départ.


1 commentaires

Vous n'avez pas besoin d'utiliser WINDBG pour charger la grève, car VS2003 est-il chargé de la fenêtre "Immédiate" lorsqu'il est arrêté à un point d'arrêt. Docs pour 2010 - msdn.microsoft.com/en-us/library/yy6d2sxs. ASPX - Instructions pour d'autres versions dans Bing.



1
votes

Vous pouvez allouer beaucoup de loh. Voici un moyen d'avoir un point de rupture sur l'allocation de LOH. BP MSCORWKS! WKS :: GC_HEAP :: Allocate_Large_Object "! CLRStack" dans Winbdg.

htth


0 commentaires

0
votes

Vous pouvez essayer de forcer les collections GEN (0) et GEN (1) et prendre un instantané immédiatement après avoir fini d'exécuter

GC.Collect(1,GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
CreateDump();


0 commentaires

2
votes

Il y a quelques 3 parties Profilers de mémoire pour .NET , essayez-leur, la plupart d'entre eux vous permettent d'essayer une période d'essai gratuite. Je m'attends à ce que l'un des principaux profileurs de mémoire vous permettront de voir ce qui se passe rapidement.


0 commentaires