Dav*_*ner 13 lisp memory sbcl common-lisp out-of-memory
我有一个没有太多内存(256Mb)的VPS,我试图使用SBCL + Hunchentoot进行Common Lisp开发来编写一些简单的web应用程序.大量的内存似乎在没有做任何特别复杂的事情的情况下被使用,并且在服务页面一段时间后,内存耗尽并且使用所有交换或者(如果没有交换)就会死掉.
所以我需要帮助:
我假设前两个是相当简单的,但第三个甚至可能吗?人们如何处理Lisp中的内存不足或受限制的内存条件?
(另外,我注意到64位SBCL似乎使用的内存是32位的两倍.这是预期的吗?我可以运行32位版本,如果它会节省大量内存)
dmi*_*_vk 14
要限制SBCL的内存使用量,请使用--dynamic-space-size选项(例如,sbcl --dynamic-space-size 128
将内存使用量限制为128M).
要找出谁在使用内存,你可以(room)
在不同的时间调用(这个函数说明正在使用多少内存):在启动时,在加载所有库之后,然后在工作期间(cource,(sb-ext:gc :full t)
在空间之前调用不测量内存)尚未收集的垃圾).
此外,可以使用SBCL Profiler来测量内存分配.
找出正在使用所有内存的内容(尤其是库或我)
Attila Lendvai 有一些特定于 SBCL 的代码来找出分配对象的来源。参考http://article.gmane.org/gmane.lisp.steel-bank.devel/12903并在需要时给他写一封私人邮件。
请务必尝试另一种实现,最好使用精确的 GC(如 Clozure CL)以确保它不是特定于实现的泄漏。
限制允许 SBCL 使用的内存量,以避免大量交换
已经有其他人回答了。
当内存耗尽时干净地处理事情,而不是崩溃(因为它是一个网络应用程序,我希望它继续并尝试清理)。
256MB 很紧,但无论如何:安排一个重复的(可能是 1 秒)定时线程来检查剩余的可用空间。如果可用空间小于 X,则使用 exec() 用新的替换当前 SBCL 进程映像。