跳转至

保留的 PTY 检测器输入

通告 URL 监视器为每个已绑定 PTY 保留一个 4,096 字符的保留缓冲,并为最多 32 个未绑定 PTY 中的每个保留 16,384 字符。Command Code 状态检测器在其特定于代理的预过滤器之前保留 300 个字符,包括普通 shell、Claude 和 Codex 输出。每个都可能通过 V8 切片字符串使整个原始输入保持存活。

该修复在丢弃超大输入时使用现有的 ownRetainedString 复制器。它保留 URL 重建、状态检测、UTF-16 码元、绑定/解绑、缓存限制以及远程/本地权限。这些是 #20960 中的三个额外边界。

复现

ORCA_BACKGROUND_LAUNCH=1 node --expose-gc docs/audits/pty-detector-retention/reproduce.mjs

该脚本打包了实际的检测器和监视器。基线仅在内存中移除三个复制调用。每个输入都有自己独立的活动所有者;URL 用例使用独立的监视器实例以隔离每个保留缓冲。堆在 GC 之后、完成部分 URL 并验证清理之前进行测量。结果包含所有者开销,而不仅仅是文本。捆绑哈希和测量。

用例 每个所有者的输入 所有者 修复前堆 修复后堆
状态检测器 64 Ki 字符 32 2,112,688 41,400
已绑定 URL 保留缓冲 64 Ki 字符 32 2,173,848 204,112
URL 待绑定 64 Ki 字符 32 2,148,824 575,512
状态检测器 4 Mi 字符 8 33,557,144 6,504
已绑定 URL 保留缓冲 4 Mi 字符 8 33,569,168 47,112
URL 待绑定 4 Mi 字符 8 33,568,936 144,504

在 macOS 上使用 Node v26.6.0 捕获。修复前有三个 GC 回归测试失败,每个保留约 32 MiB,修复后通过。五套件运行通过 164 个测试,包括现有 URL/状态行为以及复制器 Unicode/回退测试。

范围与限制

主进程在渲染器批处理之前向两个观察者提供数据。默认守护进程批量输出帧最多为 64 Ki UTF-16 字符;主进程后续的 16 Ki 字符批处理不会限制这些读取器。4 Mi 字符的用例展示了在更大输入下的保留机制,而非正常守护进程帧大小。两种实现也存在于 v1.4.198 中。

转换后的帧绕过普通分块切片,但仍面临守护进程的 16 MiB 编码行限制。原生回退输出没有应用层分块上限;此审计未确认多 MiB 原生读取。普通中继分块为 16 Ki 字符。实际的主进程馈送是 orca-runtime-on-pty-data.ts,普通守护进程边界在 daemon-stream-data-batcher.ts 中。

这些是每个所有者的最后输入成本,而不是对于固定 PTY 集合和固定大小帧的无界增长。消费相同输入的所有者可以共享同一个后备字符串,因此不能将三项测量作为独立进程成本相加。解绑会移除 URL 缓冲和待处理条目。这按活动所有者比例改善内存;它并未确定 #19831 或 #19768 的原因或增长速率。复制工作量受小型保留尾部的限制。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 orca48/orca