回

17 / 17 · Understanding the Garbage Collector

次堆、主堆、立即数

大多数块活不长。次堆只复制还活着的那一点。

列表 1 :: 2 :: 3 :: [] 是三块 cons。整数本身通常是立即数:值塞在指针宽度的字里,用最低位和指针区分,不单独占一块。

minor GC 把新生代里仍然被根(或更老的对象)指着的块拷到主堆,然后整块次堆丢掉。死掉的不用逐个扫。这就是它便宜的原因。下面可以自己点一遍,也可以跑右侧的列表,看尾部被留下。

点一遍次堆

1 / 4

次堆 minor

空

主堆 major

还没有晋升

还没有分配

次堆是一小块 nursery。多数 OCaml 块先生在这里。

例子

utop
let xs = 1 :: 2 :: 3 :: []
val xs : int list = [1; 2; 3]
let ys =
  match xs with
  | _ :: tail -> tail
  | [] -> []
val ys : int list = [2; 3]
ys
- : int list = [2; 3]

改一改

改完再跑

解释器覆盖书前半的核心:函数、标签参数、模式、记录、变体、ref、模块,以及简化的 Map 和 JSON。没有 GADT 细化、Async 和独立编译。

先预测,再对照

1 / 2

minor GC 为什么便宜?

2 / 2

小整数在 OCaml 里通常?