5

Scalaクラスライブラリで使用される標準パターンは、クラスとトレイト内のクラスの定義です。また、親クラスのオブジェクトの操作のほとんどは、それらの内部クラスのオブジェクトが作成される結果になります。各内部クラスは、オブジェクトごとに異なります。

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

ドキュメントが示唆するように、以下は2つの異なるクラスです。

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

つまり、2つのクラスが作成されます。

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

4

1 に答える 1

6

s1 != s2もしそうなら、あなたがそれをどのように結論付けたのかわかりませんs1.getLines.getClass != s2.getLines.getClassBufferedSourceを使用するインスタンスを2つ作成すると、を呼び出すとSource.fromFile、両方が同じクラスのインスタンスを返します。scala.io.BufferedSource$BufferedLineIteratorgetLines

scala> s1 == s2
res6: Boolean = false

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

Scalaが多くのクラスを作成するのは事実ですが、これは実行時ではなくコンパイル時に行われるため、permgenは長時間実行されるプロセスにとってそれほど問題にはならないはずです。

于 2011-08-18T19:45:41.463 に答える