Збір сміття не просто позбавляється від невпорядкованих об'єктів, але також ущільнює купу. Це дуже важлива оптимізація. Це не просто робить ефективніше використання пам'яті (немає невикористаних отворів), але робить кеш процесора набагато ефективнішим. Кеш - це дійсно велика справа для сучасних процесорів, вони легкі на порядок швидше, ніж шина пам'яті.
Ущільнення відбувається просто шляхом копіювання байтів. Але це вимагає часу. Чим більший об'єкт, тим більше шансів на те, що вартість його копіювання перевищує можливі покращення використання кешу CPU.
Тож вони провели купу орієнтирів, щоб визначити точку беззбитковості. І досяг 85 000 байтів як точка відсічення, коли копіювання більше не покращує перф. За винятком винятків для масивів подвійних, вони вважаються "великими", коли масив містить більше 1000 елементів. Це ще одна оптимізація для 32-розрядного коду, великий розподільник купок об'єктів має особливу властивість, що він виділяє пам'ять за адресами, вирівняними до 8, на відміну від звичайного генераційного розподільника, який виділяє лише вирівнювання до 4. Це вирівнювання є великою справою для подвійного , читання або написання неправильно вирівняного подвійного дуже дорого. Як не дивно, про рідкісну інформацію про Microsoft ніколи не згадуються масиви довгих, не впевнені, що з цим.
Fwiw, програміст багато хвилює, що велика купа об'єктів не ущільнюється. Це незмінно спрацьовує, коли вони записують програми, що споживають більше половини всього доступного адресного простору. Далі, використовуючи такий інструмент, як профілер пам'яті, з'ясувати, чому програма бомбила, хоча ще було багато невикористаної віртуальної пам'яті. Такий інструмент показує отвори в LOH, невикористані шматки пам'яті, де раніше жив великий об’єкт, але збирали сміття. Така неминуча ціна LOH, отвір може бути використаний лише шляхом виділення для об'єкта, рівного чи меншого розміру. Справжня проблема полягає в тому, що програма повинна дозволити споживати всю віртуальну пам'ять у будь-який час.
Проблема, яка в іншому випадку повністю зникає просто запуском коду в 64-бітній операційній системі. 64-бітний процес має 8 терабайт адресного простору віртуальної пам'яті, що на 3 порядки більше, ніж 32-бітний процес. Ви просто не можете закінчитися з дірочками.
Якщо коротко сказати, то LOH робить роботу коду більш ефективною. Ціною використання наявного адресного простору віртуальної пам'яті менш ефективно.
UPDATE, .NET 4.5.1 тепер підтримує ущільнення властивості LOH, GCSettings.LargeObjectHeapCompactionMode . Остерігайтеся наслідків, будь ласка.