2010-10-18 129 views
3

這個問題是關於Scala的對象,其定義是這樣的:Scala對象何時收集垃圾?

object Pipeline { 
    val dispatcher = new Dispatcher 
} 

我知道,在某些情況下,它們被稱爲「同伴」的對象引用,儘管我還不瞭解的區別。無論如何,我想知道他們什麼時候收集垃圾。所以,在上面的例子中,我想知道dispatcher佔用的內存何時被回收。

+2

'伴侶對象'是一個對象,它與同一個源文件中的某個類具有相同的名稱,例如'class Foo'和'object Foo'。 – 2010-10-18 05:30:31

回答

10

當編譯爲jave字節碼時,伴隨對象是懶惰地初始化靜態成員。對於大多數Java實現來說,這意味着當加載對象的類加載器有資格收集時,它們將有資格收集。這真的很依賴於實現。

+8

......在很多情況下意味着:從來沒有 – 2010-10-18 05:21:43

6

對象Pipeline總是「可達」的,調度器也是如此(類似於Java中的靜態字段),所以我猜測它不是垃圾收集。如果你想控制調度員的生命週期,你可以不喜歡

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

的東西作爲其他用戶建議,該對象符合時纔可以收集它的類加載器的集合。除非你有自定義的類加載方案,這意味着dispatcher不會被收集,並且它所需要的內存永遠不會被釋放(假設對象初始化了)。

除了手動重置dispatcher字段以使對應的Dispatcher對象符合收集條件外,您始終可以通過使用SoftReference自動執行此過程。