10

我对 Scala 比较陌生。

如果我有这样的构造,

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

我创建一个对象MyClass并在类方法(func())中做一些事情。我对文件中的所有行重复此操作(通过map)。因此,我在迭代的每一步(对于每一行)都创建了一个对象。当我开始下一次迭代时,范围myObj将是无效的(它们会在块结束时被销毁,还是会在内存中被孤立?)。我的疑问是垃圾收集何时触发?此外,在迭代的每一步都创建一个对象是否昂贵?当行数增加到 100 万行时,这对性能有什么影响吗?

4

2 回答 2

8

您的对象都应该很快得到垃圾收集(假设myObj.func()没有在其他地方存储指向 myObj 的指针......)。在 JVM 上,任何未引用的对象都应该被垃圾回收——一旦myObj超出范围,您对新对象的最后一次引用就会消失。

短期对象的垃圾收集通常非常便宜且高效,因此您可能不应该担心它(至少在您有基准测试/测量的性能问题证明不是这样之前......)

特别是,由于您似乎正在执行 IO(从示例文件中读取?),那么与磁盘 IO 操作的成本相比,我预计 GC 的开销可以忽略不计。

于 2013-10-21T05:27:41.323 回答
2

垃圾收集是 JVM 的职责,而不是 Scala。因此,确切的细节取决于您正在运行的 JVM。没有定义触发垃圾收集的时间;JVM 会在适当或必要时尝试执行此操作。

比我更了解 GC 算法和 JVM 调优的人可能会给你一些具体的解释来解决你的性能问题,但总的来说,我会说你应该相信 JVM 非常擅长“智能”地收集垃圾。

于 2013-10-21T05:26:41.203 回答