我有一个应用程序,为了重新加载插件,只要重新加载它们就需要使用:reload选项。我注意到,当我这样做的时候,这会增加2-3兆的内存。我很好奇是什么原因导致这种事情发生。以前重新加载的数据是否保存在内存中?有没有办法完全重新加载命名空间?
编辑:还有一点需要提一下,每个重新加载的插件都会为另一个命名空间(永远不会重新加载)的多方法创建新的defmethod。也许这些方法在重新加载时会被保存在内存中?
答案 0 :(得分:1)
Clojure将内存管理推迟到JVM。虽然我不深入了解clojure的代码库,但它可能只是重新分配了vars和重新加载的代码 - 这将留下旧的对象,直到JVM运行垃圾收集器。
您可以使用(System / gc)提示您希望GC运行的JVM,但通常不建议使用它。
或者,如果您知道系统的约束,则可以修改JVM内存标记以鼓励GC更频繁地运行(即 - 使用较小的堆大小)。
但如果你的系统不受内存限制,节省几mbs并不重要。
答案 1 :(得分:1)
事实证明,我没有足够长时间地测试它。记忆只会增长到一定程度,然后它会停止并最终回落。
男孩和女孩:在抱怨错误之前测试你的代码。