From b13a379bda40c6b5d2b00150fb37384b8c9a3378 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Fri, 11 Sep 2026 05:54:22 +0000 Subject: [PATCH] =?UTF-8?q?doc:=20=E6=99=8B=E5=8D=87=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E8=A1=A5=E6=89=A7=E8=A1=8C=E5=A4=96=E5=AE=89=E5=85=A8=E7=82=B9?= =?UTF-8?q?=E5=89=8D=E6=8F=90=E6=B3=A8=E8=AE=B0=EF=BC=9B=E5=9F=BA=E7=BA=BF?= =?UTF-8?q?=E5=8F=A3=E5=BE=84=E6=B3=A8=E6=98=8E=20peak=20=E9=87=87?= =?UTF-8?q?=E6=A0=B7=E7=82=B9=E4=B8=8E=E7=9B=B2=E5=8C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BENCHMARK_BASELINE.md | 3 ++- crates/oxide_vm/src/session_arena.rs | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/BENCHMARK_BASELINE.md b/BENCHMARK_BASELINE.md index 17a2a73b..6912c9ec 100644 --- a/BENCHMARK_BASELINE.md +++ b/BENCHMARK_BASELINE.md @@ -88,6 +88,7 @@ unary_ops 25.55 0.000 25.555 200002 mem_set_retain 原生盒边持有:Set 持 20000 个对象(各带 payload 字符串) mem_string_rope 拼接 rope 链留存:重复二元拼接形成深 Cons 链(账目按逻辑长度计,数值高于实际足迹) 口径:Peak B/Ret B 为 session 堆账目(对象头 + 堆数据 + 存活串/BigInt);epoch arena -的临时驻留无字节账目(既有口径,数量见 JSON 的 epoch_objects)。Ret B 为 workload 后 +的临时驻留无字节账目(既有口径,数量见 JSON 的 epoch_objects)。Peak B 为顶层指令 +边界采样的 session arena 高水位;单指令内瞬态与 epoch 高水位不计。Ret B 为 workload 后 晋升 + 完整 GC 的真存活集,至多含一份引擎内部副本:逃逸屏障留 epoch 原件且顶层 寄存器根不回写时,测量时晋升会把原件再克隆一份(object_graph 见留存锚测试)。 diff --git a/crates/oxide_vm/src/session_arena.rs b/crates/oxide_vm/src/session_arena.rs index 0f4e8352..e1944d07 100644 --- a/crates/oxide_vm/src/session_arena.rs +++ b/crates/oxide_vm/src/session_arena.rs @@ -130,6 +130,11 @@ impl Vm { /// 函数目标豁免均直落 epoch 值);Map/Set 等原生盒按键值直插 epoch 值。 /// `rewrite_object_values` 覆盖元素/meta/属性/proto/captured_this/home_object/ /// cell 值;克隆子树经 forwarding 去重,环与共享引用各克隆一次。 + /// + /// # 注意事项 + /// - 须在执行外的安全点调用(无在途 builtin 局部裸指针、dispatch 未重入): + /// 本方法原地改写 session 对象的引用字段,执行期调用将使 builtin 局部 + /// 裸指针失效(与 `collect_session_gc` 同前提)。 pub fn promote_session_epoch_refs(&mut self) { let objects = std::mem::take(&mut self.gc_state.session_object_ptrs); if objects.is_empty() { @@ -193,6 +198,9 @@ impl Vm { /// 账目计入克隆字节;根引用按转发表重写。 /// /// # 注意事项 + /// - 须在执行外的安全点调用(无在途 builtin 局部裸指针、dispatch 未重入): + /// 本方法改写全部根寄存器槽,执行期调用将使 builtin 局部裸指针失效 + /// (与 `collect_session_gc` 同前提)。 /// - 供 workload 后观测点(基准留存测量)使用:本方法之后存活集完全对 /// session 可见,后续完整 GC 的留存账目不再漏"仅驻留 epoch arena 的对象"。 /// - 与 `promote_session_epoch_refs` 互补:本方法处理根直接持有的 epoch 对象,