Rust's compiler (rustc) and Clang both use arena/bump allocation internally for AST and type-checking data because every node shares the same lifetime as the compilation pass, making individual frees pure overhead; V8 and other JS engines use the same trick for per-request scratch memory. The 'allocate fast, free nothing until the whole batch is done' pattern here is precisely what makes single-pass compilers and per-frame game logic avoid malloc's overhead entirely.