Améliorations des récupérations de mémoire dans CLR 4.0
Question
Récemment, j'exécutais l'exemple fourni par Andrew Hunter sur son blog "The Dangers of the Large Object Heap" compilé avec .NET 4 et j'ai obtenu les chiffres suivants:
Avec de gros blocs: 622 Mo alloués
Avec de gros blocs, des ordures fréquentes collections: 582 Mo allouées
Uniquement petits blocs: 1803 Mo alloués
Avec gros blocs, gros blocs non en croissance: 630 Mo alloués
Si le même code est compilé avec.NET 2.0, j'ai presque les chiffres mentionnés dans l'article:
Avec de gros blocs: 21 Mo alloués
Avec de gros blocs, des ordures fréquentes collections: 26Mo allouées
Seulement petites blocs: 1811Mb alloués
Avec de grands blocs, gros blocs ne poussant pas: 707 Mo alloués
Quelle est la cause d'une telle amélioration spectaculaire?
Le code est compilé pour la plate-forme x86 et est exécuté sur Windows 7
La solution
Certains travaux indispensables de l'équipe CLR sont à l'origine des améliorations, mais apparemment, il y a encore place à l'amélioration:
http:// mitch-Wheat.blogspot.com/2010/11/net-clr-large-object-heap.html
Autres conseils
Quelque chose a changé mais c'est un secret bien gardé, je n'y trouve rien.Je n'y mettrais pas trop de stock.L'exemple de code a été réglé manuellement pour rendre le tas d'objets volumineux CLR 2 aussi mauvais que possible.Même un petit changement dans l'algorithme, peut-être inspiré par l'article de blog, aura des effets très importants.
Je peux penser à certaines choses faciles que Microsoft aurait pu faire à l'allocateur de mémoire qui auraient considérablement réduit la fragmentation LOH sans une refonte majeure, comme arrondir les tailles d'allocation à un multiple comme 4K.Étant donné que les plus petits objets LOH non statiques étaient de 85 Ko, cela représenterait au plus une perte de 5% d'espace utile, mais réduirait le nombre d'objets et d'espaces de différentes tailles.BTW, je ne suis vraiment pas convaincu de la valeur de forcer tous les gros objets à la LOH (par opposition, peut-être, à avoir un moyen de désigner quand un objet est créé s'il doit aller à la LOH ou non).Je peux comprendre qu'il est utile de séparer les petits objets des grands une fois qu'ils atteignent le niveau 2, mais il y a suffisamment de cas où de gros objets sont créés et abandonnés pour que les forcer au niveau 2 semble contre-productif.