SBCL 的 REPL 中的内存泄漏

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

Eli*_*son 5

仅仅因为没有任何东西再引用这些对象并不意味着内存将被回收。垃圾收集器将在将来的某个时间运行,并且通常您获得的唯一保证是它将在出现内存不足错误之前运行。

这里可能发生的另一件事是您正在查看 Lisp 进程的内存使用情况。当内存被 CG'ed 时,它通常不会返回到操作系统。相反,内存只是在堆上标记为空闲,并且可以在将来的内存分配中使用。

  • 有效的观点,我没有想到这一点。所以我做了进一步的测试:评估“(add-one (test-gc))”几次。如果任何一点都是有效的,那么我永远不会耗尽内存。然而,经过几次评估后,我得到:“堆耗尽”。所以内存似乎没有被释放或重用。 (2认同)