Lift 2.0 带来的 Actor 和 StatefulSnippets 等功能给我留下了深刻的印象,但我有点担心这些东西的内存开销。我的问题是双重的:
- Lift 如何确定何时垃圾收集状态对象?
- 页面请求的内存占用是什么样的?
如果一个网络爬虫在网站的足迹上跳舞,他们是否会打开足够多的状态对象来淹没一个适度的 VPS (512M)?这个问题显然取决于应用程序,但我很好奇是否有人可以向我抛出任何现实世界的数字。
Lift 将状态信息存储在会话中,因此一旦会话被销毁,与该会话关联的状态就会消失。
在会话中,Lift 跟踪每个页面的状态分配(例如,浏览器中的 ajax 按钮和服务器上的功能之间的映射)并从浏览器获得心跳。在 10 分钟内没有看到心跳的页面的函数是未引用的,因此 JVM 可以对它们进行垃圾收集。所有这些都是可调的,因此您可以更改心跳频率、功能寿命等,但在实践中,默认值工作得很好。
就会话爆炸而言,是的……这是一个小问题。热门网站(包括http://demo.liftweb.net/)体验一下。示例代码(请参阅http://github.com/lift/lift/tree/master/examples/example/)检测由单个请求创建的会话,然后放弃并提前过期。我正在运行具有 256MB 堆大小(适合 512MB VPS)的 demo.liftweb.net,有时会话数会超过 1,000,但很快就会因搜索引擎流量而受到抑制。
我认为关于内存占用的问题曾经在邮件列表的某个地方得到回答,但我现在找不到。
垃圾收集在一些空闲时间后完成。然而,wiki 上有一个示例,它使用一些更好的启发式方法来终止由网络爬虫产生的会话。
当然,对于您自己的项目,在自己生成几个会话的同时使用 VisualVM 之类的东西检查内存消耗是有意义的。