我对Scala比较陌生。
如果我有这样的结构,
sampleFile.map(line => line.map {
var myObj = new MyClass(word);
myObj.func();
})
我创建了一个MyClass
的对象,并在类方法(func()
)中执行某些操作。我对文件中的所有行重复此操作(通过map
)。所以,我在迭代的每一步创建一个对象(对于每一行)。当我开始下一次迭代时,myObj
的范围将是无效的(它们会在块的末尾被销毁,还是会在内存中被孤立?)。我怀疑垃圾收集何时触发?此外,在迭代的每一步创建一个对象是否昂贵?当线路数量增加到100万时,这是否有任何性能影响?
答案 0 :(得分:7)
你的对象应该很快收集垃圾(假设myObj.func()
没有在其他地方存储指向myObj的指针......)。在JVM上,任何未引用的对象都应该被垃圾收集 - 一旦myObj
超出范围,您对新对象的最后引用就会消失。
短期对象的垃圾收集通常非常便宜和高效,所以你可能不应该担心它(至少在你有基准测试/测量性能问题证明不是这样的话...... 。)
特别是,由于您似乎正在执行IO(从示例文件中读取?),因此我预计与磁盘IO操作的成本相比,GC的开销可以忽略不计。
答案 1 :(得分:2)
垃圾收集是JVM的责任,而不是Scala。因此,具体细节取决于您正在运行的JVM。没有定义触发垃圾收集的时间; JVM尝试在适当或必要时进行此操作。
在GC算法和JVM调优方面比我更了解的人可能会给你一些具体的解释来解决你的性能问题,但总的来说我会说你应该相信JVM非常擅长垃圾收集“智能”。