我对 REPL 中 SBCL 垃圾收集器的以下行为感到有些困惑。定义两个函数:
(defun test-gc ()
(let ((x (make-array 50000000)))
(elt x 0)))
(defun add-one (x) (+ 1 x))
然后运行
(add-one (test-gc))
我希望不再有任何内容引用原始数组。然而,正如(房间)报告的那样,内存没有被释放。我会理解,如果我直接运行 (test-gc),那么一些引用可能会卡在 SLIME 或
(list * ** ***)
但是这里是这样吗?谢谢,安德烈。
更新 前段时间我提交了一个错误。最近得到证实。看: https://bugs.launchpad.net/sbcl/+bug/936304
最佳答案
仅仅因为没有任何对象再引用对象并不意味着内存将被回收。垃圾收集器将在未来某个时间运行,通常您获得的唯一保证是它会在出现内存不足错误之前运行。
这里可能发生的另一件事是您正在查看 Lisp 进程内存使用情况。当内存被 CG 时,它通常不会返回给操作系统。相反,内存只是在堆上标记为空闲,并且可以在未来的内存分配中使用。
关于memory-leaks - SBCL 的 REPL 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9342871/