保留的 CI 和终端文本尾部¶
带上限的 V8 字符串切片可能使其整个原始输入保持存活。受影响的 CI 摘录缓存可接受 128 条 16 KiB 文本,下载量最高可达 64 MiB。GitLab 的 raw-trace 截断会到达同一个共享摘录函数。终端会话/急切/关闭缓冲区、延迟重连队列、最近输出缓冲区以及错误表面,尽管存在逻辑上限,也保留了过大的父对象。
该修复为 CI、持久化会话尾部和 main/relay 最近输出复用了现有的共享 ownRetainedString 复制器。渲染器队列和错误复用其现有的 flattenRetainedSlice 辅助函数。内容、Unicode、早期错误选择、缓存计数和传输负载保持相同。普通未截断的终端块保持其现有路径。main/relay 最近输出保留块边界,用于路径候选回填。
本地持久化回滚缓冲区已被修剪;会话缓冲区修复主要覆盖远程或尚未分类的所有者。队列和错误修复覆盖本地和远程输出。main/relay 最近输出缓冲区具有可配置上限,默认为 64 Ki 个字符。
复现¶
该脚本打包了实际的生产函数。其基线仅在内存中移除六个新的复制边界;生产文件未被修改。每个用例保留八个不同的输入:每个 CI 日志 2 Mi 个字符,每个终端输入 4 Mi 个字符。它在 GC 后测量堆,并清除 V8 独立的旧版 RegExp 输入引用。打包哈希和测量结果位于 results.json。
| 用例 | 返回字节数,全部八个 | 修复前保留堆 | 修复后 |
|---|---|---|---|
| GitHub 长行 | 131,072 | 16,787,512 | 145,224 |
| GitHub 早期 Unicode 错误 | 131,064 | 33,577,840 | 112,744 |
| GitLab 长行 | 131,072 | 16,793,640 | 147,312 |
| 持久化终端缓冲区 | 4,194,304 | 33,555,624 | 4,195,032 |
| 急切/前置处理器/关闭尾部 | 4,194,304 | 33,556,040 | 4,202,608 |
| main/relay 最近输出 | 524,288 | 33,558,752 | 527,384 |
| 终端错误表面 | 32,000 | 33,555,864 | 33,336 |
| 延迟重连尾部 | 4,194,304 | 33,565,384 | 4,198,352 |
在 macOS 上使用 Node v26.6.0 捕获。堆样本包含分配器/GC 波动;显著的分隔是相关结果。回归测试也保留实际的错误状态以及关闭/重连/最近输出队列对象。
验证通过:六个 CI/提供商/辅助套件共 41 个测试;六个终端存储/所有权/UTF-8 套件共 69 个测试;三个错误/重连套件共 28 个测试;以及最终七个最近输出/CI/终端/复制器套件共 63 个测试。这些是按运行计数的数量,并且存在重叠。完整类型检查和变更代码质量检查通过。
全部六个上限/切片路径都存在于 v1.4.198 中。#19831 和 #19768 均未建立事件归因所需的 CI 日志查看或超大终端输入。复制成本随保留上限扩展:每个 CI 摘录 16 KiB,每个错误 4,000 个字符,最大字节上限缓冲区为 512 KiB,延迟重连为 512 Ki 个字符。该变更不会减少临时原始输入分配。
后续 PTY 检测器复现 在同一 PR 中添加了三个边界:advertised-URL 携带项、等待工作区绑定的输出,以及普通 PTY 也使用的 Command Code 状态携带项。三十二个生产规模的 64 Ki 字符输入在每个隔离基线中保留约 2.1 MB。受所有权的携带项将其减少到约 41 KB、204 KB 或 575 KB,包括不同的所有者对象。这些按所有者计的成本不是无界增长曲线,并且读取同一输入的读者可以共享其父对象。后续在五个检测器/URL/复制器套件中添加了 164 个通过的测试。
Claude 任务元数据复现 添加了共享的 512 字符描述/名称边界。JSON 解析的任务帧在实际的活动、已结算和最近移除的 tracker 条目中保留了其父对象。八个 4 Mi 字符输入在复制前保留约 32 MiB,复制后为 7–12 KB;32 个较小的 64 Ki 字符输入在复制前保留约 2.1 MB,复制后为 25–45 KB。这些合成字段确立了一种保留机制,而不是已报告事件的触发因素。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 orca48/orca