Finding and Fixing Ghostty's Largest Memory Leak
9 hours ago
- Ghostty 存在严重的内存泄漏,运行10天后内存使用量高达37 GB。
- 该泄漏是由滚动修剪优化引起的,该优化在重用非标准页面时没有调整底层内存分配的大小,导致内存从未被释放。
- 修复方案是在修剪过程中不再重用非标准页面,而是正确销毁它们,并从内存池中分配一个新的标准尺寸页面。
- 该泄漏由 Claude Code 的命令行界面触发,该界面产生大量多码位字素输出,迫使 Ghostty 频繁使用非标准页面。
- 该漏洞是通过 macOS 上的虚拟内存标签识别的,这使得将泄漏与 PageList 结构关联起来变得容易。
- Ghostty 使用 PageList 数据结构,其中标准页面使用内存池,非标准页面使用 mmap;泄漏发生是因为元数据错误地将大页面标记为标准页面。
- 已添加了一个测试来重现该泄漏并防止未来回归。