Scala类库中使用的标准模式是类和特征中类的定义。父类对象的大多数操作都会导致创建这些内部类的对象。每个对象的每个内部类都不同。
e.g。 请参阅scala.io.Source和LineIterator的源代码。我认为这是标准库中最简单的一个。
正如文件所示,下面是两个不同的类别。
val s1:Source = ...
val s2:Source = ...
s1.getLines.getClass != s2.getLines.getClass //true if s1 != s2
表示创建了两个类。
由于整个集合库使用相同的模式,对于长时间运行的进程有什么影响permgen空间?
答案 0 :(得分:6)
我不确定你是如何得出结论s1 != s2
,然后是s1.getLines.getClass != s2.getLines.getClass
。如果我使用BufferedSource
创建两个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不应该是一个问题。