Clojure闭包和垃圾回收机制

13
据我了解,在Java(以及Clojure)中使用的默认ClassLoader会保存指向任何匿名类的指针,从而持有lambda和closure。这些对象永远不会被垃圾回收,因此会造成“内存泄漏”。目前正在为Java 7或8(https://blogs.oracle.com/jrose/entry/anonymous_classes_in_the_vm)进行调查,以添加一个匿名ClassLoader,不会保留对这些函数的引用。与此同时,人们如何处理使用这些构造的语言(例如Clojure和Scala)编写长时间运行的应用程序呢?
是否可能Clojure提供自己的匿名ClassLoader,扩展系统ClassLoader,但不保留已创建的类的引用?

你为什么认为它还没有做到这一点?看一下Compiler.java文件,搜索makeClassLoader的调用。 - bendin
1个回答

15
bendin的评论和Michael Fogus和Chris Houser所著《Clojure之乐》第七章第7.2节中“编译时 vs. 运行时”的信息来看,Fogus和Houser解释了闭包和匿名函数在编译时编译成字节码,并且每次对返回闭包的高阶函数的调用只是返回闭包类的新实例而不是一个新的类。这些实例当然会被垃圾回收。由于匿名函数和闭包数量在编译时有一个明显的上限,因此内存很少会成为问题。

我的担忧是没有必要的。


3
谢谢您提出这个问题。即使您的担忧是没有根据的,我也从您的努力中学到了新的有用知识。 - A. Levy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接