Сборка мусора не только избавляется от объектов, на которые нет ссылок, но и сжимает кучу.Это очень важная оптимизация.Это не только делает использование памяти более эффективным (без неиспользуемых отверстий), но и делает кэш-память процессора более эффективной.Для современных процессоров кэш-память представляет собой большую проблему, она на порядок проще, чем шина памяти.
Сжатие выполняется простым копированием байтов.Это, однако, требует времени.Чем крупнее объект, тем больше вероятность того, что стоимость его копирования превысит возможные улучшения использования кэша ЦП.
Поэтому они выполнили ряд тестов для определения точки безубыточности.И достигла 85 000 байтов в качестве точки отсечения, где копирование больше не улучшает производительность.За исключением двух массивов, они считаются «большими», когда массив содержит более 1000 элементов.Это еще одна оптимизация для 32-битного кода, распределитель кучи больших объектов обладает специальным свойством, которое распределяет память по адресам, которые выровнены по 8, в отличие от обычного распределителя поколений, который распределяет только по 4. Такое выравнивание является большой проблемой для двойногоЧтение или запись неверно выровненного двойника очень дорого.Как ни странно, в редкой информации Microsoft никогда не упоминаются массивы длинных, не уверенных, что с этим.
Кстати, многие программисты беспокоятся о том, что куча больших объектов не уплотняется.Это неизменно срабатывает, когда они пишут программы, которые занимают более половины всего доступного адресного пространства.Затем следует использовать инструмент, такой как профилировщик памяти, чтобы выяснить, почему программа взорвалась, несмотря на то, что было еще много доступной виртуальной памяти.Такой инструмент показывает дыры в LOH, неиспользуемые фрагменты памяти, где ранее жил большой объект, но собирал мусор.Такова неизбежная цена LOH, дыра может быть повторно использована только выделением для объекта, который равен или меньше по размеру.Настоящая проблема заключается в том, что программе следует разрешить в любое время потреблять всю виртуальную память.
Проблема, которая в противном случае полностью исчезает при запуске кода в 64-разрядной операционной системе.,64-разрядный процесс имеет 8 терабайт доступного адресного пространства виртуальной памяти, на 3 порядка больше, чем 32-разрядный процесс.Вы просто не можете выбежать из дыр.
Короче говоря, LOH делает код более эффективным.За счет использования доступного адресного пространства виртуальной памяти менее эффективно.
UPDATE. NET 4.5.1 теперь поддерживает сжатие свойства LOH, GCSettings.LargeObjectHeapCompactionMode .Остерегайтесь последствий, пожалуйста.