使用require with:reload选项是否有在Clojure中建立内存的趋势?
我有一个应用程序,为了重新加载插件,每当需要重新加载插件时,都需要使用:reload选项。我注意到,当我这样做的时候,它会一次积累大约2-3兆的内存。我很好奇是什么导致了这种事情的发生。以前重新加载的数据是否保存在内存中?有没有办法完全重新加载命名空间使用require with:reload选项是否有在Clojure中建立内存的趋势?,clojure,Clojure,我有一个应用程序,为了重新加载插件,每当需要重新加载插件时,都需要使用:reload选项。我注意到,当我这样做的时候,它会一次积累大约2-3兆的内存。我很好奇是什么导致了这种事情的发生。以前重新加载的数据是否保存在内存中?有没有办法完全重新加载命名空间 编辑:还需要指出的是,每个重新加载的插件都会为另一个命名空间中的多方法生成新的defmethods(永远不会重新加载)。在重新加载时,这些方法可能保存在内存中?Clojure将内存管理推迟到JVM。虽然我对clojure的代码库不太了解,但它可能
编辑:还需要指出的是,每个重新加载的插件都会为另一个命名空间中的多方法生成新的defmethods(永远不会重新加载)。在重新加载时,这些方法可能保存在内存中?Clojure将内存管理推迟到JVM。虽然我对clojure的代码库不太了解,但它可能只是用重新加载的代码重新分配变量——这将在JVM运行垃圾收集器之前保留旧对象 您可以向JVM提示您希望GC使用(System/GC)运行,但通常不建议使用 或者,如果您知道系统的限制,您可以修改JVM内存标志,以鼓励GC更频繁地运行(即使用较低的堆大小)
但是,如果您的系统没有真正的内存限制,节省几MB并不重要。事实证明,我没有对它进行足够长的测试。内存只会增长到一定的水平,然后就会停止,最终会下降很多
男孩和女孩:在抱怨bug之前测试代码。我在Clojure中开发的方法是修改源代码,然后使用/require函数和:reload选项。我没有经历过你所描述的,但我通常不使用多重方法,而且只有少数函数被重新定义。