【发布时间】:2011-06-03 10:21:10
【问题描述】:
经过 2 天的调试,我确定了我的时间猪:Python 垃圾收集器。
我的应用程序在内存中保存了很多对象。而且效果很好。
GC 执行通常的回合(我没有使用默认阈值 (700, 10, 10))。
偶尔,在一个重要事务的中间,第 2 代扫描开始并审查我的约 150 万代第 2 代对象。
这需要 2 秒!
名义交易时间不到 0.1 秒。
我的问题是我该怎么办?
我可以关闭第 2 代扫描(通过设置非常高的阈值 - 这是正确的方法吗?)并且 GC 很听话。
我应该什么时候打开它们?
我们使用 Django 实现了一个 Web 服务,每个用户请求大约需要 0.1 秒。
理想情况下,我将在 用户 API 请求之间运行这些 GC gen 2 周期。但是我该怎么做呢?
我的视图以 return HttpResponse(), AFTER 结束,我想运行第 2 代 GC 扫描。
我怎么做?这种方法是否有意义?
我可以标记永远不需要被垃圾收集的对象,这样 GC 就不会在每个第二代循环中测试它们吗?
当 Django 服务器相对空闲时,如何配置 GC 以运行全扫描?
多个平台(Windows / Linux)上的 Python 2.6.6。
【问题讨论】:
-
“我的应用程序在内存中有很多对象”?怎么样?
-
容器是标准字典。对象本身是我自己的类实例(从对象派生)或元组,其中一项是对所述类实例的引用(其余项是整数)。
-
既然 Django Request 和 Reply 对象是瞬态的,你怎么能在内存中保存任何东西呢?
-
@S.Lott:例如通过将字典放在模块的命名空间中。并非所有内容都必须存在于请求/响应周期中。
-
@piquadrat:正确。还有其他方法。使用模块代替 Sessions 可能适合这个问题,也可能不适合。准确地知道发生了什么而不是猜测是很重要的。在没有更多证据的情况下,我不容易相信这是 GC。
标签: python django garbage-collection