memory-leaks - SBCL 的 REPL 中的内存泄漏

标签 memory-leaks common-lisp sbcl

我对 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/

相关文章:

lisp - 在 Common LISP 中更改中流字节宽度

c++ - 处理内存分配时的保护标志

javascript - 当我误用Interval Observable时如何释放内存?

common-lisp - 为什么用这种方法将列表改变为它的第一个元素在 Common Lisp 中不起作用?

vector - 收集到向量而不是列表

types - 如何指定 sbcl(或 common lisp)向量中的元素类型?

lisp - SBCL "subst"效率

由 MySQL 库引起的 Java 内存泄漏

objective-c - autorelease 是否隐藏了 Instruments 中的泄漏?

common-lisp - 重命名导出符号的批量 `unintern`