Lisp 垃圾收集期间耗尽scbl异常堆

Lisp 垃圾收集期间耗尽scbl异常堆,lisp,common-lisp,sbcl,Lisp,Common Lisp,Sbcl,当我们的应用程序运行一段时间(例如,运行数小时)时,sbcl将抛出堆耗尽异常 垃圾收集期间堆耗尽:可用1968字节,请求2128字节。 Gen StaPg UbSta LaSta润滑脂盒装未盒装润滑脂!移动所有废物触发WP地面军事系统成员 0: 0 0 0 0 0 0 0 0 0 0 0 5368709 0 0 0.0000 1: 0 0 0 0 0

当我们的应用程序运行一段时间(例如,运行数小时)时,sbcl将抛出堆耗尽异常

垃圾收集期间堆耗尽:可用1968字节,请求2128字节。 Gen StaPg UbSta LaSta润滑脂盒装未盒装润滑脂!移动所有废物触发WP地面军事系统成员 0: 0 0 0 0 0 0 0 0 0 0 0 5368709 0 0 0.0000 1: 0 0 0 0 0 0 0 0 0 0 0 5368709 0 0 0.0000 2: 0 0 0 0 0 0 0 0 0 0 0 5368709 0 0 0.0000 3: 101912 101913 0 0 19362 20536 0 0 0 162867456 554752 102714709 0 1 1.4405 4: 130984 131071 0 0 29240 18868 0 0 25 191196152 5854216 128537781 14785 1 0.6442 5: 75511 81013 0 0 16567 17127 92 99 36 132974568 5818392 2000000 16565 0 0.0000 6: 0 0 0 0 7949 1232 0 0 0 37605376 0 2000000 7766 0 0.0000 分配的总字节数=524643552 动态空间大小字节=536870912 GC控制变量: *GC-INHIBIT*=真 *GC-PENDING*=真 *STOP-FOR-GC-PENDING*=false SBCL pid 3281(tid 3067845440)中遇到致命错误: 累坏了,游戏结束了。 欢迎使用LDB,它是Lisp运行时环境的低级调试器。 ldb>
有什么建议吗?

SBCL不允许您在堆上分配超过
(sb ext:动态空间大小)
字节的空间。这里有一个512MB的默认大小(536870912字节),而Lisp程序在尝试进行另一次分配时已经使用了接近这个大小

通过使用--dynamic space size 1024启动SBCL,可以将可用堆空间量增加一倍,达到1024MB。但是,正如一些评论所指出的,可能存在内存泄漏,其中引用的对象在某种程度上与系统运行的时间成比例,因此这只会提供暂时的喘息

(room t)
标准公共Lisp函数调用可能有助于调试此功能,如果您定期调用它的话


像这样深入研究SB-VM内部分配图的更高级代码可以提供更多信息,而且SBCL有一个统计分析器,也支持报告分配。

建议:不要耗尽堆。看来你有一些内存泄漏,我。E我偶尔也会遇到同样的问题,它不是确定性的,因此我(还)无法提交错误报告或找到我自己的错误。但我遇到的常见模式是,我为短期使用分配了大量内存。由于SBCL使用[generational garbage collection]{},这可能是由于对更高代的错误清除造成的。因此,您可能希望将内存使用率高的短期函数强制分为不同的线程,因为这解决了我的问题,因为在线程死亡后,内存将被释放。另一个解决方案可能是
sbcl--dynamic space size
看看这篇文章,这将帮助您指出使用sbcl profiler的工作示例?我似乎无法从中获得任何有意义的产出。我正在使用Fiveam和CLOS,遇到了与询问者类似的问题。