Что вызывает удивление, так это работа сборщика мусора. Cначала запускаю приведенную выше программу с аллокацией блоков по 128 МБ, удается зааллокировать 1.4 ГБ. ОК. Затем запускаю ту же программу с аллокацией блоков по 32 МБ (TestAllocate4.Do(22)). Удается зааллокировать 1.1 ГБ. Ладно. Теперь опять пытаюсь аллокировать блоки по 128 МБ: не удается зааллокировать ни один блок! Казалось бы, сборщик мусора должен при первом требовании освободить место в изначально выделенном адресном пространстве, поскольку на элементы массива после отработки программы ссылок уже нет?  Services.Collect ситуации не меняет. Правда, если многократно запускать TestAllocate4.Do(24), то  в какой-то момент удается таки зааллокировать первые 128 МБ, затем больше и в конце-концов опять дойти до 1.4 ГБ! Т.е. сборщик мусора в конце-концов таки срабатывает, правда отдает блоки памяти очень неохотно. Такое поведение это что - особенность реализации сборки мусора или все-же баг??