Scala垃圾回收?

11

我对Scala相对较新。

如果我有如下结构,

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

我创建了一个MyClass对象,并在类方法func()中执行一些操作。 我通过map处理文件中的所有行进行重复操作。 每次迭代(每行),我都会创建一个新的对象。当我开始下一个迭代时,myObj的范围将为void(它们将在块结束时被销毁还是在内存中被删除?)。 我想知道垃圾收集什么时候触发。同时,每次迭代时创建对象是否昂贵?如果行数增加到100万条,是否会影响性能?

2个回答

9
您的对象应该会很快被垃圾回收(假设myObj.func()没有将指针存储在其他地方...)。在JVM上,任何未被引用的对象都应该被垃圾回收 - 并且当myObj超出范围时,您对新对象的最后一个引用就消失了。
短生命周期对象的垃圾回收通常非常便宜和高效,因此您可能不必担心它(至少在您具有证明相反的基准/测量性能问题之前...)。
特别是,由于您似乎正在进行IO操作(从示例文件中读取?),因此我预计GC的开销与您的磁盘IO操作成本相比微不足道。

3

垃圾回收是JVM的责任,而不是Scala。因此,具体细节取决于您正在运行哪个JVM。没有定义触发垃圾回收的时间;JVM在适当或必要时尝试执行它。

对于GC算法和JVM调优方面比我更有知识的人可能能够给您一些具体的解释来解决您的性能问题,但总的来说,我认为您应该相信JVM在智能地进行垃圾回收方面做得相当不错。


1
不完全正确。这里有一个语言层面的问题——Scala中的匿名函数由Function对象表示,并且它的分配方式(仅一次或每次迭代)可能会影响性能。 - om-nom-nom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接