2011-08-18 4 views
5

Scalaクラスライブラリで使用される標準パターンは、クラスと特性内のクラスの定義です。親クラスのオブジェクトの操作の大半は、それらの内部クラスのオブジェクトが作成される結果になります。各内部クラスは、オブジェクトごとに異なります。perm gen空間でのScalaクラス定義の効果

scala.io.SourceおよびLineIteratorのソースを参照してください。私はこれが標準ライブラリの中で最もシンプルなものだと思います。

以下のドキュメントには、2つの異なるクラスがあります。

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

意味は2つのクラスが作成されます。

コレクションライブラリ全体で同じパターンが使用されているため、長期実行プロセスのpermgenスペースにどのような影響がありますか?

答えて

6

s1 != s2の場合、s1.getLines.getClass != s2.getLines.getClassと結論付けてどういう結論か分かりません。 BufferedSourceという2つのインスタンスをSource.fromFileを使用して作成すると、getLinesを呼び出すと、両方とも同じクラスscala.io.BufferedSource$BufferedLineIteratorのインスタンスが返されます。

scala> s1 == s2 
res6: Boolean = false 

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

それはScalaはクラスの多くを作成しますが、これはコンパイル時に行われ、実行時ではないので、パーマ世代が長時間実行中のプロセスのために問題のよりすべきではないというのは本当です。

関連する問題