J’ai écrit un long serveur de socket de connexion TCP en C #. Spike en mémoire dans mon serveur se produit. J’ai utilisé dotNet Memory Profiler (un outil) pour détecter les memory leaks. Memory Profiler indique que le tas privé est énorme et que la mémoire est semblable à celle ci-dessous (le nombre n’est pas réel, ce que je veux montrer, ce sont les trous GC0 et GC2 sont très très gros, la taille des données est normale):
Managed heaps - 1,500,000KB Normal heap - 1400,000KB Generation #0 - 600,000KB Data - 100,000KB "Holes" - 500,000KB Generation #1 - xxKB Data - 0KB "Holes" - xKB Generation #2 - xxxxxxxxxxxxxKB Data - 100,000KB "Holes" - 700,000KB Large heap - 131072KB Large heap - 83KB Overhead/unused - 130989KB Overhead - 0KB
Howerver, quel est le trou GC? La documentation de dotNet Memory Profiler définit les “trous”:
Les «trous» représentent la mémoire non utilisée entre deux instances allouées. Des «trous» apparaissent lorsque le segment de mémoire n’est pas complètement compacté, en raison d’instances épinglées ou d’optimisations dans le ramasse-miettes.
Ce que je veux savoir, c’est:
J’espère que quelqu’un pourra l’expliquer.
Un object épinglé est un object qui n’est pas autorisé à se déplacer en mémoire. Cela est souvent nécessaire lorsque vous travaillez avec du code non géré, ce qui nécessite de passer un pointeur sur une structure en mémoire. Par défaut, le garbage collector est libre de déplacer cette structure afin de gérer au mieux la mémoire. Nous avons donné à un code non géré un pointeur sur cette structure, puis, si son code est déplacé, le code non géré ne pointe plus vers la structure correcte, ce qui entraîne un comportement inattendu.
La solution consiste à “épingler” cet object pour indiquer au GC qu’il ne doit pas le déplacer.
Vous ne pouvez pas compresser explicitement le tas, le GC doit donc le faire lui-même lors d’une collecte totale ou partielle (à l’exception du LOH ). Si vous épinglez de nombreux objects, il sera plus difficile pour lui de gérer cela correctement. Pour plus de détails sur le CPG, voir Principes de base du récupérateur de place et astuces sur les performances.