Skip to content

返回学习路线

本任务分别运行两个收集器。第一部分允许程序与逐字段标记交错,但只有强指针;第二部分冻结堆,加入弱槽和 ephemeron。两份模型各自交付实际堆结果,不把它们合并成一个尚未证明的并发弱引用回收器。

下载标准库参考程序,执行 python foundation-conditional-gc-check.py。普通模式与 python -O 使用同样的显式 require 检查并输出同一份 JSON;脚本只写标准输出。所有对象名都是教学 ID,mutator 只能经根路径获得对象,不能凭 ID 创建指针。

任务一:把对象搬到收集器身后 ​

读增量标记与插入写屏障。输入 A=[null], B=[C], C=[], U=[],根按 A、B 排列。

交付开始及每条命令后的颜色、游标、灰队列和字段:先执行一个标记步骤,接着 A[0]:=B[0],再清空 B[0],最后耗尽标记队列并清扫。指令接口是 store((0,),0,(1,0)) 与 store((1,),0,None);第一个整数选根槽,后面整数逐个选字段。

正确运行共完成三个标记步骤,扫描 A、B 的两个字段槽;C 的零字段完成仍算一步。C 在第一条 store 中染灰,最终只释放 U。关闭字段屏障后,标记只有两步,释放 C、U,输出 lost_reachable=["C"],A 留下指向已释放 C 的字段。不要只统计“释放两个对象更多”,必须指出哪个仍可经根取得。

结构迁移:将 A 改为两个空字段,其他动作不变。第一步后 A 仍灰,游标是 1。分别运行 all、black、none 三种教学策略;all 保住 C,black 与 none 都误删 C。前者一共四个标记步骤、三个字段扫描。把写入位置从字段 0 改为字段 1 后,当前灰对象还会扫描该位置,black 在这一具体轨迹可以碰巧安全;这不修复它对字段 0 的失败。

任务二:保留不等于本轮精确可达 ​

在 A=[]、根 [A,null] 的堆上开始标记。分配两空字段的 Fresh 并发布到第二根,再清该根,耗尽标记后清扫。本轮留下 A、Fresh;第二轮不再执行 mutator,Fresh 被释放。

交付两轮实际堆,不要每轮都从原始堆重建。解释为何“所有最终可达对象被保留”足以排除误删,却不要求本轮立刻回收 Fresh。再把 Fresh 的一个字段写 A;只要 Fresh 仍无根,下轮仍可把 Fresh 回收,A 由原根独立保存。

说明暂停预算:单次字段标记为常数工作,不代表整个收集无长暂停。开始清标、扫描根、末尾扫对象表仍随输入规模增长;参考快照和完整不变量检查另有遍历费用。

任务三:按键启动一条条件链 ​

读弱引用与 Ephemeron 条件追踪。完整输入如下:

text
对象:E1 E2 Ebad W K1 K2 V1 V2 Kbad Vbad U
根:E1 E2 Ebad W K1
普通强字段:V1=[K2];Vbad=[Kbad];其余均为空数组
弱槽:W=[Kbad]
记录输入顺序:E2:(K2,V2),E1:(K1,V1),Ebad:(Kbad,Vbad)

提交首次入队顺序与 cause:五根之后是 V1、K2、V2。最终保留八个,释放 Kbad、Vbad、U;W 弱槽与 Ebad 两槽清空。主程序 activated=[E2,E1] 是按记录输入顺序输出的激活集合,不是激活时间,不能据此倒置因果。等待项共检查 5 次,普通强字段扫描 1 次;入口验证会另外访问全部字段,包括 Vbad 的那个字段。

必须对照两个失败算法。一遍扫描 E2 后不再检查会漏掉稍后才获得活键的 V2;把所有记录值当作强字段则会经 Vbad→Kbad 保留无外部起点的坏环。画出两种错误导致的保留集合,而不是仅写“需要固定点”。

从正确的第一轮输出继续,去掉 K1 根。第二轮仅留 E1、E2、Ebad、W,释放 K1、K2、V1、V2,并清空 E1、E2 的记录。验证剩余每一个非空强字段、弱槽和保留值都指向剩余堆内对象。

任务四:哪个条件不可省 ​

  1. 令堆为 E、K、V,唯一根 K,记录 E:(K,V)。正确只留 K。解释为什么键活着不足以让不可达 holder 的值继续存在
  2. 令根为 E,记录 E:(K,K),无普通边。正确清空记录并释放 K,说明它为何等价于指向 K 的弱盒
  3. 回到十一对象原输入,加 Kbad 为根。此时 Vbad→Kbad 有真实外部起点,Kbad、Vbad 可以保留;下一轮去掉 Kbad 根,二者才回收。对比“每次都从原图重算”与“在回收后的实际堆继续”的差别
  4. 交换记录输入顺序及根顺序。首次入队顺序可以改变,最小闭包与清槽结果必须不变。给出一个 holder=key 的例子,核实两份等待项只激活一次

最后写一段验收结论:增量强边模型证明的是清扫安全的包含关系;冻结条件模型证明的是最小固定点的精确相等。不同输入、观察和时序条件下,两项结论不能相互替代。