mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-11-02 07:43:42 +08:00
Worker runtimes reserve one region for 32 arenas of 40 class slices. When the host refused the full region (32 arenas of 1 GiB slices, 1.28 TiB of address space), the allocator kept 32 arenas and shrank every slice. Under valgrind, which maps at most 56 GiB, slices dropped to 16 MiB, and every class whose live blocks outgrew 16 MiB took the system allocator. Callgrind profiles then counted system allocations that a native run never makes: tsc-ts checking VS Code made 10.3 M small calloc calls under valgrind and 0.06 M natively. The reservation now tries arena counts from 32 down to 4 at each slice size, from 1 GiB down, before smaller slices, and 2 and 1 arena only when no slice size fits 4. Arenas that are not reserved stay claimed, so threads beyond them use the system allocator, and the region bounds of foreign frees use the arenas reserved. Hosts that map the full region keep 32 arenas of 1 GiB slices. A runtime test limits RLIMIT_AS to 60 GiB and checks that the first thread gets 256 MiB slices for 400,000 blocks of 56 bytes, that three more threads get arenas and a fourth uses the system allocator, and that blocks freed across threads keep their contents.