Reverting the incremental GC in Python 3.14 and 3.15

· coding · Source ↗

TLDR

  • Python core team is reverting the 3.14 incremental GC due to significant memory pressure in production, restoring the generational GC from 3.13 in a 3.14 patch release and 3.15 alpha.

Key Takeaways

  • The incremental GC shipped in 3.14 without going through the PEP process, which is now cited as a root cause of insufficient evaluation.
  • Memory pressure reports from production environments triggered the revert; 3.14.5 will be released early to carry the fix.
  • 3.15 is still in alpha, so the revert is low-risk there; an extra alpha 9 may ship if the revert lands within a week of the announcement.
  • A future incremental GC for 3.16 must go through the formal PEP process and more thorough evaluation before shipping.
  • Maintaining two GC implementations simultaneously in 3.14 was ruled out as too costly and risky.

Hacker News Comment Review

  • Commenters flagged the governance gap: a major runtime component shipped without a PEP, raising questions about oversight for similarly impactful changes like the JIT.
  • The .NET comparison surfaced: Microsoft’s internal dogfooding at scale gives their GC changes dense telemetry before release, something CPython lacks.
  • Concern centers less on the revert itself and more on how a problematic GC change reached a final release without adequate production-scale testing.

Notable Comments

  • @simonw: Free-threading (no-GIL) uses its own separate GC and is unrelated to this incremental GC revert.
  • @athoscouto: Confirmed real production impact; services showed continuous memory growth tracing back to aiohttp clients being recreated per request, surfaced via memray on 3.14.

Original | Discuss on HN