2013-10-21 161 views
7

我對斯卡拉比較陌生。斯卡拉垃圾收集?

如果我有這樣的結構,

sampleFile.map(line => line.map { 
    var myObj = new MyClass(word); 
    myObj.func(); 
}) 

我創建的MyClass對象,做一個類的方法(func())裏面的東西。我對文件中的所有行重複此操作(通過map)。所以,我在迭代的每一步(爲每一行)創建一個對象。當我開始下一次迭代時,myObj的作用域將會失效(它們會在塊的末尾被銷燬,還是會在內存中被孤立出來?)。我懷疑是垃圾收集何時觸發?另外,在迭代的每一步創建一個對象是否昂貴?當行數增加到100萬時,這是否有任何性能影響?

回答

7

你的對象應該都會相當快地收集垃圾(假設myObj.func()不會在其他地方存儲指向myObj的指針......)。在JVM上,任何未引用的對象都應該被垃圾回收 - 並且只要myObj超出範圍,對新對象的最後引用就會消失。 短期對象

垃圾回收一般是非常便宜和有效的,所以你可能不應該擔心它(至少要等到你有證明,否則基準/測量的性能問題....)

特別是,由於您似乎在做IO(從示例文件中讀取?),我預計GC的開銷與磁盤IO操作的成本相比可以忽略不計。

1

垃圾收集是JVM的責任,而不是Scala。所以確切的細節取決於您正在運行的JVM。沒有定義時間觸發垃圾收集; JVM會在適當或必要時嘗試執行此操作。

對於GC算法和JVM調優問題,有些人比我知識淵博,可能會給你一些具體的解釋來解決你的性能問題,但總的來說,我應該說你應該相信JVMs在垃圾收集「智能」。

+1

不完全。在由Function對象表示的Scala中有一種語言方面 - 匿名函數,並且它被分配的方式(一次或每次迭代都會影響性能)。 –