跳转至

保留的 CI 和终端文本尾部

带上限的 V8 字符串切片可能使其整个原始输入保持存活。受影响的 CI 摘录缓存可接受 128 条 16 KiB 文本,下载量最高可达 64 MiB。GitLab 的 raw-trace 截断会到达同一个共享摘录函数。终端会话/急切/关闭缓冲区、延迟重连队列、最近输出缓冲区以及错误表面,尽管存在逻辑上限,也保留了过大的父对象。

该修复为 CI、持久化会话尾部和 main/relay 最近输出复用了现有的共享 ownRetainedString 复制器。渲染器队列和错误复用其现有的 flattenRetainedSlice 辅助函数。内容、Unicode、早期错误选择、缓存计数和传输负载保持相同。普通未截断的终端块保持其现有路径。main/relay 最近输出保留块边界,用于路径候选回填。

本地持久化回滚缓冲区已被修剪;会话缓冲区修复主要覆盖远程或尚未分类的所有者。队列和错误修复覆盖本地和远程输出。main/relay 最近输出缓冲区具有可配置上限,默认为 64 Ki 个字符。

复现

ORCA_BACKGROUND_LAUNCH=1 node --expose-gc docs/audits/retained-text-slices/reproduce.mjs

该脚本打包了实际的生产函数。其基线仅在内存中移除六个新的复制边界;生产文件未被修改。每个用例保留八个不同的输入:每个 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