我有一个没有太多内存(256Mb)的VPS,我试图使用SBCL + Hunchentoot进行Common Lisp开发来编写一些简单的web应用程序.大量的内存似乎在没有做任何特别复杂的事情的情况下被使用,并且在服务页面一段时间后,内存耗尽并且使用所有交换或者(如果没有交换)就会死掉.
所以我需要帮助:
找出使用所有内存的内容(如果它是库或我,尤其是)
限制SBCL允许使用的内存量,以避免大量的交换
当内存耗尽时,处理干净的东西,而不是崩溃(因为它是一个web-app,我希望它继续并尝试清理).
我假设前两个是相当简单的,但第三个甚至可能吗?人们如何处理Lisp中的内存不足或受限制的内存条件?
(另外,我注意到64位SBCL似乎使用的内存是32位的两倍.这是预期的吗?我可以运行32位版本,如果它会节省大量内存)
要限制SBCL的内存使用量,请使用--dynamic-space-size选项(例如,sbcl --dynamic-space-size 128
将内存使用量限制为128M).
要找出谁在使用内存,你可以(room)
在不同的时间调用(这个函数说明正在使用多少内存):在启动时,在加载所有库之后,然后在工作期间(cource,(sb-ext:gc :full t)
在空间之前调用不测量内存)尚未收集的垃圾).
此外,可以使用SBCL Profiler来测量内存分配.