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