mirror of
https://github.com/LadybirdBrowser/ladybird
synced 2026-05-11 17:37:33 +02:00
Instead of sweeping all heap blocks in one go after marking, sweep incrementally, one block at a time, interleaved with program execution. This significantly reduces worst-case GC pause times by spreading sweep work across multiple smaller time slices. Sweep is driven by two complementary mechanisms: 1. Timer-based sweeping: A 16ms repeating timer drives background sweep work, processing blocks for up to 5ms per timer fire. 2. Allocation-directed sweeping: Each allocator sweeps its own pending blocks before creating new ones, ensuring forward progress even without timer events. Each allocator maintains its own list of blocks pending sweep, and allocators with pending work are tracked in a separate list for efficient timer-driven sweeping. Key implementation details: - Newly allocated cells during sweep are marked immediately to prevent premature collection. - Mark bits are cleared incrementally as each block is swept, rather than in a separate pass over the entire heap. - Finalization and weak reference processing remain stop-the-world since they must complete atomically before any sweeping occurs.