什么时候Scala对象被垃圾收集?

时间:2010-10-18 04:45:19

标签: scala garbage-collection

这个问题是关于Scala对象的,它们的定义如下:

object Pipeline {
   val dispatcher = new Dispatcher
}

我知道,在某些情况下,它们被称为“伴侣”对象,尽管我还不了解这种区别。无论如何,我想知道什么时候收集垃圾。所以,在上面的例子中,我想知道dispatcher占用的内存何时被回收,如果有的话。

3 个答案:

答案 0 :(得分:10)

当编译为jave字节码时,伴随对象被懒惰地初始化为静态成员。对于大多数Java实现,这意味着当加载对象的类加载器符合收集条件时,它们将有资格进行收集。但它确实非常依赖于实现。

答案 1 :(得分:6)

对象Pipeline总是“可以访问的”,调度程序也是如此(类似于Java中的静态字段),所以我的猜测是它不是垃圾收集的。如果要控制调度程序的生命周期,可以执行类似

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

答案 2 :(得分:3)

正如其他用户建议的那样,只有在可以收集其类加载器时,该对象才有资格进行收集。除非您有自定义类加载方案,否则这意味着dispatcher不会被收集,并且它所需的内存永远不会被释放(假设对象首先被初始化)。

除了手动重置dispatcher字段以使相应的Dispatcher对象符合收集条件外,您始终可以使用SoftReference自动完成此过程。