Вот как работает диспетчер кучи ББ (в основном режиме, там есть ещё режим для случая DLL - когда блоки запрашиваются у стандартного системного HeapAlloc).
## Код:
```
PROCEDURE AllocHeapMem (size: INTEGER; VAR c: Cluster);
      (* allocate at least size bytes, typically at least 256 kbytes are allocated *)
      CONST M = 1536 * 100000H;   (* 1.5 GByte *)
      CONST N = 65536;   (* cluster size for dll *)
      VAR adr, s: INTEGER;
```


ББ пытается зарезервировать под свою кучу в адресном пространстве процесса кластер размером начиная с M байт (деля M пополам, если не получилось, пока не получится). Резервируются только адреса (reserve виртуальной памяти).
Таким образом, при старте ББ резервируется 1 кластер памяти 1.5 Гб, в рамках которого идёт реальное выделение блоков (commit зарезервированных адресов) и отдача их под динамические объекты.

Как только этот 1.5 Гб кластер вычерпан, происходит выделение ещё одного кластера. Тем же путём 1.5Гб делится на два, пока не удастся выделить такой кусок. Т.е. следующий кластер будет 201 Мб (т.к. 406 не влезет никак) или меньше, как повезёт. Потом - 100, а у Вас размер одного массива - 134 Мб.