2011-10-14 10 views
6

多くのクラスでScalaに大きなGUIアプリケーションを作成しており、すべてのクラスをロードできるようにPermGenスペースを増やす必要がありました。アプリケーション自体には一連の画面ベースのアクティビティが表示され、それぞれに独自の大きなクラスセットがロードされます。任意の時点で1つのアクティビティのみがロード/表示されます。いくつかの活動を行った後、PermGenスペースにOutOfMemoryErrorがありました。複数のクラスローダーを使用してPermGenスペースを保存する

私はPermGenのスペースがgarbage collected just like the rest of the heapであることを理解していますが、私はPermGenのスペースを減らすことができますか?アクティビティごとに1つずつClassLoaderがあり、クラスのアンロードを許可します。だから、

  1. 私は、彼らは永遠に自分のクラスローダによって参照されるように、システムクラスローダによってロードされたクラスは、アンロードすることができないことを理解しています。本当?
  2. 私のカスタムクラスローダーによってロードされたクラスのインスタンスがなくなり、クラスローダーがガベージコレクションされ、そのクラスがアンロードされ、PermGenスペースが解放されますか?
  3. クラスのアンロードに関連する警告(または一般的な間違い)がありますか?
+0

PermGenの大きさはどれくらいですか? –

+0

128mが小さすぎると、現在は256mが動作しますが、どれくらい時間がかかりますか? –

答えて

6

...もし私が、例えば、クラスをアンロードできるようにアクティビティごとに1つずつ ClassLoader。

はい、Classesをアンロードするには、使用するClassloaderがガベージコレクションされている必要があります。つまり、すべての単一のクラスおよびクラスローダー自体への参照はゼロである必要があります。

PermGenの大きさは?あなたはコマンドラインでPermGenを打つだけで取り除くことができます:

-XX:MaxPermGen=256m 

それを512mに設定するのは珍しいことではありません。本当に堅牢なソリューションが必要な場合は、「アクティビティ」ごとにカスタムクラスローダーを使用するルートに進む必要があります。デバッグを支援するために、同様にあなたのコマンドラインに次の自明の引数を追加します。それらはコマンドラインにJVMにロードされるため、このクラスを出力します

-XX:+TraceClassLoading 

+0

答えをありがとう。 Mac OS XのJREバージョン1.6.0_26では '-XX:+ TraceClassloading'が利用できません。どんな交換? –

+0

-XX:+ TraceClassLoading –

+0

これはうまくいきました。私は '-XX:+ TraceClassUnloading'も使用しています。 –