使用带有:reload选项的require是否有在Clojure中建立内存的倾向?

时间:2010-09-02 11:49:26

标签: clojure

我有一个应用程序,为了重新加载插件,只要重新加载它们就需要使用:reload选项。我注意到,当我这样做的时候,这会增加2-3兆的内存。我很好奇是什么原因导致这种事情发生。以前重新加载的数据是否保存在内存中?有没有办法完全重新加载命名空间?

编辑:还有一点需要提一下,每个重新加载的插件都会为另一个命名空间(永远不会重新加载)的多方法创建新的defmethod。也许这些方法在重新加载时会被保存在内存中?

2 个答案:

答案 0 :(得分:1)

Clojure将内存管理推迟到JVM。虽然我不深入了解clojure的代码库,但它可能只是重新分配了vars和重新加载的代码 - 这将留下旧的对象,直到JVM运行垃圾收集器。

您可以使用(System / gc)提示您希望GC运行的JVM,但通常不建议使用它。

或者,如果您知道系统的约束,则可以修改JVM内存标记以鼓励GC更频繁地运行(即 - 使用较小的堆大小)。

但如果你的系统不受内存限制,节省几mbs并不重要。

答案 1 :(得分:1)

事实证明,我没有足够长时间地测试它。记忆只会增长到一定程度,然后它会停止并最终回落。

男孩和女孩:在抱怨错误之前测试你的代码。