应对Common Lisp(SBCL)中的内存使用并将其最小化

Dav*_*ner 13 lisp memory sbcl common-lisp out-of-memory

我有一个没有太多内存(256Mb)的VPS,我试图使用SBCL + Hunchentoot进行Common Lisp开发来编写一些简单的web应用程序.大量的内存似乎在没有做任何特别复杂的事情的情况下被使用,并且在服务页面一段时间后,内存耗尽并且使用所有交换或者(如果没有交换)就会死掉.

所以我需要帮助:

  • 找出使用所有内存的内容(如果它是库或我,尤其是)
  • 限制SBCL允许使用的内存量,以避免大量的交换
  • 当内存耗尽时,处理干净的东西,而不是崩溃(因为它是一个web-app,我希望它继续并尝试清理).

我假设前两个是相当简单的,但第三个甚至可能吗?人们如何处理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来测量内存分配.

  • SBCL手册中有关于剖析器的描述,网址为http://www.sbcl.org/manual/Det​​erministic-Profiler.html (2认同)

Les*_*zer 5

找出正在使用所有内存的内容(尤其是库或我)

Attila Lendvai 有一些特定于 SBCL 的代码来找出分配对象的来源。参考http://article.gmane.org/gmane.lisp.steel-bank.devel/12903并在需要时给他写一封私人邮件。

请务必尝试另一种实现,最好使用精确的 GC(如 Clozure CL)以确保它不是特定于实现的泄漏。

限制允许 SBCL 使用的内存量,以避免大量交换

已经有其他人回答了。

当内存耗尽时干净地处理事情,而不是崩溃(因为它是一个网络应用程序,我希望它继续并尝试清理)。

256MB 很紧,但无论如何:安排一个重复的(可能是 1 秒)定时线程来检查剩余的可用空间。如果可用空间小于 X,则使用 exec() 用新的替换当前 SBCL 进程映像。