La collecte des ordures dans .NET (générations)
J'ai lu beaucoup de .Performance NETTE des articles qui décrivent Gen1,Gen2 la collecte des ordures et objets de survivre à la des générations.
Pourquoi les objets survit à la collection?
Qu'est-ce que l'épinglage?
Comment puis-je en apprendre plus à ce sujet?
- Vous obtenez une copie de CLR via C# et de lire le Chapitre sur la collecte des Ordures. C'est un peu viandé sujet - à savoir le d'un forum en ligne.
Vous devez vous connecter pour publier un commentaire.
Une raison quelconque, vous disposez de plusieurs générations dans un garbage collector est pour éviter de perdre la mémoire à la fragmentation.
Chaque appel de fonction peut dire que la création et
suppressionde la collection de plusieurs objets, et de sorte que le segment de mémoire pour votre programme tend à fragmenter très rapidement. Ce qui laisse des trous derrière qui ne sont pas très utilisable. Le résultat est que votre programme doit être périodiquement de-fragmenté, tout comme un disque dur. C'est en partie ce qui se passe pendant une collection.Lorsqu'un objet survit à une collection, il est déplacé à une plus longue durée de génération sur la théorie que si elle a survécu à une collection, il survivra probablement d'autres. Ainsi, les générations futures ont moins de turn-over et ne pas fragmenter autant. Cela signifie que votre programme passe moins de temps ensemble jonglerie choses pour nettoyer les trous et les déchets moins de mémoire. C'est également une amélioration par rapport à traditionnel de gestion de la mémoire (malloc/free ou de new/delete), qui a laissé le système d'exploitation pour gérer toute la fragmentation de la mémoire.
La raison pour laquelle un objet survit collection est parce qu'il ya quelque chose quelque part qui est quand même "portée" et contient une référence à cet objet. Il existe quelques façons dont vous pouvez faire en sorte que cela arrive, et puis l'oublier au sujet de la référence, de sorte qu'il est possible de "fuite" de la mémoire dans le code managé.
Parfois, les gens sont tentés d'appeler
GC.Collect()
dans un effort pour obtenir le garbage collector pour nettoyer quelque chose. Peut-être qu'ils ont découvert qu'ils ont une fuite, ou que la mémoire est de plus en plus fragmenté. Vous devez résister à ces pulsions. Alors que la collecte des ordures dans .Net n'est pas parfait, est-il très bon, et il est presque certainement beaucoup mieux de nettoyage de la mémoire que vous êtes. Les chances sont que si un objet peut et doit être recueillies, il sera. Rappelez-vous que l'appel àGC.Collect()
peut en fait aggraver les choses en aidant le garbage collector de déplacer des objets jusqu'à une hausse de la génération, et donc de les maintenir autour pour plus qu'ils ne le seraient autrement.Au lieu de cela, si vous croyez que vous avez une fuite, look à votre propre code pour quelque chose comme le monde ou variable statique qui pourrait détenir une référence pour beaucoup d'autres éléments. Le seul moment où vous devriez appeler
GC.Collect()
, c'est quand vous avez de l'information à propos de la nature du programme qui n'est pas disponible pour le garbage collector, et c'est assez rare que le GC connaît chaque référence que vous avez créé."Épinglage" est pour quand vous avez besoin pour passer un objet à un non géré la bibliothèque. Le garbage collector peut déplacer un objet physique de l'emplacement dans la mémoire, et si vous avez besoin de "pin" dans un endroit ou le pointeur utilisé par les non géré bibliothèque pourrait devenir invalide. A épinglé objet ne peut être perçu, et donc vous ne devriez pas le code pin d'un objet pour plus longtemps que nécessaire.
http://blogs.msdn.com/maoni/ est une bonne ressource.
Poser des questions ici aide aussi 🙂
Pour vos questions:
Pourquoi les objets survivre à la collecte:
Les objets de survivre à une collection quand ils sont des "objets vivants", ou "Accessible objets". Accessible objets sont des objets où il y a une référence à partir d'un autre objet qui est sur:
Qu'est-ce que l'Épinglage:
L'épinglage signifie que l'objet ne se déplace pas dans la mémoire. le mouvement des objets dans la mémoire comme un résultat d'un compactage GC, vous pouvez créer un GCHandle tapé épinglé si vous voulez à la broche un objet, en épinglant arrive aussi automatiquement derrière la sciene pour les objets qui sont transmis en code natif via PInvoke ( comme des chaînes de caractères qui sont transmis en tant que sortie, la mémoire tampon interne obtient épinglé lors de l'appel à PInvoke ).
Découvrez http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.gchandle.aspx pour un bon exemple à propos de GCHandle.
Ici est un court mais complet programme que j'ai écrit à demostrate gen 2 la collecte des ordures dans une application en cours d'exécution
http://nomorehacks.wordpress.com/2008/11/27/forcing-the-garbage-collector/
J'ai pensé cet article était très bon aussi bien.
http://msdn.microsoft.com/en-us/library/ms973837.aspx
Sujet très important. Ci-dessus est un bon résumé de MME
Cette est un article intéressant sur le sujet que vous pourriez trouver instructif.
L'épinglage est utilisé pour maintenir le garbage collector de déplacer des objets. Il peut nuire à la performance par la limitation de ce que le garbage collector peut faire. En général épinglé les objets doivent être épinglé pour aussi court que possible.