Problem
GC_TYPE_DATE_CELL and GC_TYPE_TEMPORAL are movable: false (gc/types.rs:462-503), as are large Buffers/TypedArrays (gc/types.rs:357-386). Consequences:
- A single long-lived
new Date() (16-byte cell) in a nursery block prevents that block from ever being evacuated — the block stays committed for the Date's lifetime (~1 MB pinned per scattered cell).
- In old-gen, one non-movable object on a 4 KB page makes the whole page ineligible for defrag (
gc/oldgen.rs:131-133,142-145, skip at :1553), and one per 1 MB block prevents whole-block reclaim.
- An ORM-style app caching a
Date per record sprays non-movable cells across every allocation-active block; compaction becomes structurally impossible for those blocks regardless of policy tuning.
Proposed fix
Date/Temporal cells are pointer-free — they are the cheapest possible objects to move (memcpy + forwarding, no interior rewriting). Mark them movable and let the existing forwarding machinery handle them. Alternatively, segregate non-movable types into dedicated blocks/pages so they can't contaminate movable space (also covers large buffers).
Context
2026-07-09 GC audit (allocator/fragmentation dimension). Related: the evacuation-policy metric fix (releasable block bytes instead of candidate object bytes) is being implemented separately; this issue covers the type-level movability.
Problem
GC_TYPE_DATE_CELLandGC_TYPE_TEMPORALaremovable: false(gc/types.rs:462-503), as are large Buffers/TypedArrays (gc/types.rs:357-386). Consequences:new Date()(16-byte cell) in a nursery block prevents that block from ever being evacuated — the block stays committed for the Date's lifetime (~1 MB pinned per scattered cell).gc/oldgen.rs:131-133,142-145, skip at:1553), and one per 1 MB block prevents whole-block reclaim.Dateper record sprays non-movable cells across every allocation-active block; compaction becomes structurally impossible for those blocks regardless of policy tuning.Proposed fix
Date/Temporal cells are pointer-free — they are the cheapest possible objects to move (memcpy + forwarding, no interior rewriting). Mark them movable and let the existing forwarding machinery handle them. Alternatively, segregate non-movable types into dedicated blocks/pages so they can't contaminate movable space (also covers large buffers).
Context
2026-07-09 GC audit (allocator/fragmentation dimension). Related: the evacuation-policy metric fix (releasable block bytes instead of candidate object bytes) is being implemented separately; this issue covers the type-level movability.