···119119}
120120121121pub fn main() !void {
122122- // use libc allocator for long-lived state (caches, DB connections, host maps).
123123- // per-frame ArenaAllocators use page_allocator instead — glibc malloc was not
124124- // returning freed arena pages to the OS under high-churn multi-thread load,
125125- // causing linear RSS growth (~3.5 GiB over 12h). page_allocator uses mmap/munmap
126126- // directly, guaranteeing page return on arena.deinit().
122122+ // use libc allocator — glibc malloc has per-thread arenas, madvise-based page
123123+ // return, and proven fragmentation mitigation. GPA is a debug allocator that
124124+ // tracks per-allocation metadata and never returns freed pages to the OS.
127125 const allocator = std.heap.c_allocator;
128126129127 // parse config from env
+1-1
src/subscriber.zig
···257257 const sub = self.subscriber;
258258259259 // lightweight header decode for cursor tracking + routing
260260- var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
260260+ var arena = std.heap.ArenaAllocator.init(sub.allocator);
261261 defer arena.deinit();
262262 const alloc = arena.allocator();
263263