Skip to content

[perf] Minor GC does O(old-gen) work: full-region sweep walk, whole-heap RS rebuild, per-cycle page-meta iterations #6181

Description

@proggeramlug

Problem

Minor GC cost includes several O(old-gen) components even when nothing old is touched:

  1. Sweep visits/rewrites every old-gen header on every minor (gc/oldgen.rs:1181-1225 cursor over all regions; flags/accounting rewrites gc/oldgen.rs:1291-1311,1338,1357; minors set reclaim_dead_old_blocks=false but still walk, gc/cycle.rs:1390-1416).
  2. The remembered-set finalize rebuild walks the ENTIRE heap (all arena objects + full malloc registry) every cycle (gc/cycle.rs:1244-1264, gc/verify.rs:279-349), and with require_marked=false for minors it re-dirties pages from unreachable-but-unswept old parents.
  3. Old-page bookkeeping iterates every old 4 KB page meta up to 3× per minor (arena/page_meta.rs:555-571, gc/oldgen.rs:181-184,1199), plus the promotion-handoff pre-walk over all arena objects once survivor in-use ≥ 24 MB (gc/policy.rs:864-902).

Minor pause grows monotonically with process lifetime on servers.

Proposed fix

  • Restrict the minor sweep cursor to nursery+survivor regions; maintain old-gen accounting incrementally from promotion/reclaim events; per-block live counts so fully-dead block reset needs no per-object walk.
  • Maintain the RS incrementally (the barriers already do) and restrict the finalize rebuild to evacuated/moved parents — rebuild_evacuated_old_to_young_remembered_set (gc/verify.rs:243-253) plus the CI: gc_write_barrier_stress red on main (missing old→young remembered-set edges → segfault) #5029 snapshot repair already exist for exactly this.
  • Lazy epoch-counter resets for page metas; keep defrag candidates on a small heap updated at promotion time.

Context

2026-07-09 GC audit (pause/scalability + barrier dimensions).

Metadata

Metadata

Assignees

No one assigned

    Labels

    performanceRuntime, compile-time, build-size, or memory performancetriagedMaintainer reviewed; type, scope, and next step are clear

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions