这个问题是关于Scala对象的,它们的定义如下:
object Pipeline {
val dispatcher = new Dispatcher
}
我知道,在某些情况下,它们被称为“伴侣”对象,尽管我还不了解这种区别。无论如何,我想知道什么时候收集垃圾。所以,在上面的例子中,我想知道dispatcher
占用的内存何时被回收,如果有的话。
答案 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
自动完成此过程。