【问题标题】:When are Scala objects garbage collected?Scala 对象什么时候被垃圾回收?
【发布时间】:2010-10-18 04:45:19
【问题描述】:

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

object Pipeline {
   val dispatcher = new Dispatcher
}

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

【问题讨论】:

  • “伴生对象”是与同一源文件中的某个类同名的对象,例如class Fooobject Foo

标签: scala garbage-collection


【解决方案1】:

当编译为 jave 字节码伴生对象是懒惰初始化的静态成员。对于大多数 java 实现,这意味着当加载对象的类加载器符合收集条件时,它们就有资格被收集。不过,这确实是非常依赖于实现的东西。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-30
        • 1970-01-01
        • 2017-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多