Scala类定义对perm gen空间的影响

Khu*_*jaz 5 scala permgen

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

例如,请参阅scala.io.Source和LineIterator的source.我认为这是标准库中最简单的一个.

正如文件所示,下面是两个不同的类.

val s1:Source = ...
val s2:Source = ...
s1.getLines.getClass != s2.getLines.getClass //true if s1 != s2
Run Code Online (Sandbox Code Playgroud)

意味着创建了两个类.

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

Ben*_*mes 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
Run Code Online (Sandbox Code Playgroud)

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