Scala对象何时进行垃圾回收?

5
这个问题涉及到Scala对象,它们的定义方式类似于这样:

object Pipeline {
   val dispatcher = new Dispatcher
}

我知道在某些情况下,它们被称为“伴随”对象,但我还不理解其中的区别。无论如何,我想知道它们何时被垃圾回收。因此,在上面的示例中,如果可能的话,我想知道由dispatcher占用的内存何时被回收。


2
一个'伴生对象'是一个与同一源文件中某个类具有相同名称的对象,例如class Fooobject Foo - user382157
3个回答

10

当编译为Java字节码时,伴生对象是惰性初始化的静态成员。 对于大多数Java实现,这意味着当加载对象的类装载器符合收集条件时,它们会被收集。不过这些都是非常依赖具体实现的内容。


6

对象“Pipeline”始终是“可访问的”,而调度程序也是如此(类似于Java中的静态字段),因此我猜它不会被垃圾回收。如果您想控制调度程序的生命周期,可以执行以下操作:

object Pipeline {
    var dispatcher = Some(new Dispatcher)
    def close() { dispatcher = None }
}

3
正如其他用户所建议的那样,只有当其类加载器可以被收集时,该对象才有资格进行收集。除非您有自定义的类加载方案,否则这意味着dispatcher不会被收集,它所需的内存永远不会被释放(假设该对象首先被初始化)。
除了手动重置dispatcher字段以使相应的Dispatcher对象有资格进行收集之外,您还可以使用SoftReference来自动化此过程。

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