Scala的Lift如何管理状态?

时间:2010-08-22 07:37:40

标签: scala lift stateful footprint

我对Lift 2.0带有Actors和StatefulSnippets等的表格印象深刻,但我有点担心这些事情的内存开销。我的问题有两个:

  1. Lift如何确定何时垃圾收集状态对象?
  2. 页面请求的内存占用量是多少?
  3. 如果网络抓取工具在网站的足迹上跳舞,他们是否会打开足够的状态对象以淹没适度的VPS(512M)?这个问题非常明显取决于应用程序,但我很好奇是否有人有任何现实世界的数字,他们可以抛弃我。

2 个答案:

答案 0 :(得分:12)

提升会在会话中存储状态信息,因此一旦会话被销毁,与该会话关联的状态就会消失。

在会话中,Lift跟踪分配状态的每个页面(例如,浏览器中的ajax按钮与服务器上的功能之间的映射)并且具有来自浏览器的心跳。未在10分钟内看到心跳的页面的功能未被引用,因此JVM可以对它们进行垃圾回收。所有这些都是可调的,因此您可以改变心跳频率,功能寿命等,但在实践中,默认值可以很好地工作。

就会话爆炸而言,是的......这是一个小问题。热门网站(包括http://demo.liftweb.net/)体验它。示例代码(请参阅http://github.com/lift/lift/tree/master/examples/example/)检测由单个请求创建的会话,然后放弃并尽早过期。我正在运行带有256MB堆大小的demo.liftweb.net(它适合512MB VPS),偶尔会话数量增加超过1,000,但这会迅速遏制搜索引擎流量。

答案 1 :(得分:1)

我认为关于内存占用的问题曾在邮件列表的某个地方得到解答,但我目前无法找到它。

垃圾收集在一些空闲时间后完成。但是,example on the wiki使用了一些更好的启发式方法来消除网络抓取工具产生的会话。

当然,对于你自己的项目,在自己生成几个会话的同时用VisualVM检查内存消耗是有意义的。