多くのクラスを含む大規模なGUIアプリをScalaで作成しており、すべてのクラスをロードできるようにするには、PermGenスペースを増やす必要がありました。アプリ自体は一連の画面ベースのアクティビティを表示し、各アクティビティは独自の大きなクラスのセットをロードします。どの時点でも、1つのアクティビティのみがロード/表示されます。いくつかの活動を経た後、私たちはOutOfMemoryError
PermGenスペースにいました。
PermGenスペースはヒープの他の部分と同じようにガベージコレクションさClassLoader
れることを理解していますが、クラスのアンロードを可能にするために、たとえばアクティビティごとに1つ持つことで、必要なPermGenスペースを減らすことができるかどうかを確認したいと思います。
それで:
- システムClassLoaderによってロードされたクラスは、クラスローダーによって永久に参照されるため、アンロードできないことを理解しています。本当?
- カスタムクラスローダーによってロードされたクラスのインスタンスがもう存在せず、クラスローダーをガベージコレクションできる場合、そのクラスはアンロードされ、PermGenスペースが解放されますか?
- クラスのアンロードに関する警告(またはそれを妨げる一般的な間違い)はありますか?