5

Scala 类库中使用的标准模式是在类和特征中定义类。并且大多数父类对象的操作都会导致这些内部类的对象被创建。每个对象的每个内部类都是不同的。

例如,查看 scala.io.Source 和 LineIterator 的源代码。我认为这是标准库中最简单的一个。

正如以下文件所建议的那样,有两个不同的类。

val s1:Source = ...
val s2:Source = ...
s1.getLines.getClass != s2.getLines.getClass //true if s1 != s2

这意味着创建了两个类。

由于整个集合库都使用相同的模式,对于长时间运行的进程,对 permgen 空间有什么影响?

4

1 回答 1

6

我不确定您是如何得出结论的,如果s1 != s2,那么s1.getLines.getClass != s2.getLines.getClass。如果我创建了两个BufferedSourceusing实例Source.fromFile,那么scala.io.BufferedSource$BufferedLineIterator当我调用getLines.

scala> s1 == s2
res6: Boolean = false

scala> s1.getLines.getClass == s2.getLines.getClass
res7: Boolean = true

Scala 确实创建了很多类,但这是在编译时完成的,而不是在运行时完成的,因此对于长时间运行的进程来说,perm gen 应该不是问题。

于 2011-08-18T19:45:41.463 回答