Улучшения сборки мусора в CLR 4.0 - PullRequest
9 голосов
/ 24 марта 2011

Недавно я запускал пример, предоставленный Эндрю Хантером в его блоге «Опасность кучи больших объектов» , скомпилированный с .NET 4, и я получил следующие цифры:

С большими блоками: выделено 622 Мб
С большими блоками, частым мусором коллекции: выделено 582 Мб
Только небольшие блоки: выделено 1803 Мб
с большие блоки, большие блоки не растет: выделено 630Мб

Если тот же код скомпилирован для .NET 2.0, я получу почти числа, упомянутые в статье:

С большими блоками: выделено 21 МБ
С большими блоками, частым мусором Коллекции: 26Mb выделено
Только небольшие блоков: 1811Mb выделено
с большим блоки, большие блоки не растут: 707Mb выделено

В чем причина такого резкого улучшения?

Код скомпилирован для платформы x86 и работает в Windows 7

Ответы [ 3 ]

4 голосов
/ 24 марта 2011

Что-то изменилось, но это хорошо держится в секрете, я ничего не могу найти по этому поводу.Я бы не стал вкладывать слишком много средств в это.Пример кода был настроен вручную, чтобы куча больших объектов в CLR 2 выглядела настолько плохо, насколько это возможно.Даже небольшое изменение в алгоритме, возможно, вдохновленное сообщением в блоге, будет иметь очень большие последствия.

4 голосов
/ 24 марта 2011

Причиной улучшений является некоторая столь необходимая работа команды CLR, но, очевидно, еще есть возможности для улучшения:

http://mitch -wheat.blogspot.com / 2010/11 /нетто-CLR-большой объект-heap.html

2 голосов
/ 24 марта 2011

Я могу вспомнить некоторые простые вещи, которые Microsoft могла бы сделать с распределителем памяти, который бы значительно уменьшил фрагментацию LOH без капитального ремонта, например, округление размеров выделения до нескольких кратных, например 4K. Учитывая, что наименьшие нестатические объекты LOH были 85 КБ, это означало бы не более 5% потери полезного пространства, но уменьшало бы количество объектов разного размера и промежутков. Кстати, я на самом деле не убежден в том, что значение принудительного вызова всех больших объектов в LOH (в отличие от, возможно, наличия средства указания, когда объект создается, должен ли он идти в LOH или нет). Я могу понять некоторую ценность в отделении маленьких объектов от больших, как только они достигнут Уровня 2, но есть достаточно случаев, когда большие объекты создаются и забрасываются, что принуждение их к уровню 2 кажется контрпродуктивным.

...