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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top