0

ガベージコレクションを行う前に、何千ものJavaClassLoaderとクラスを生成するアプリケーションがあります。クラスローダーのリークはないと確信していますが、permgenエラーが発生しています(発生したとしても、この質問は潜在的なリークと直交しています)。

特定のClassLoaderとそのロードされたクラスがpermgenではなくヒープに配置されるように指定する方法はありますか?

LinuxでOracleJDKJava6を使用しています。


編集:Java8にはPermGenがなくなるようです。Metaspaceに置き換えられます。

http://java.dzone.com/articles/java-8-permgen-metaspace

4

2 に答える 2

2

もちろん、perm gen エラーが発生しています。これは、クラス ローダーがクラスを配置する場所です。あなたは何を期待しますか?

Java NIO のようにバイト バッファにマップできますが、ヒープにはなりません。

とてつもない対策を講じる前に、パーマのサイズを大きくしてみてください。どのくらいの perm gen スペースが必要ですか? Visual VM を使用してプロファイリングし、確認します。

于 2013-03-20T21:57:23.930 に答える
1

特定のClassLoaderとそのロードされたクラスがpermgenではなくヒープに配置されるように指定する方法はありますか?

AFAIK、それを行う方法はありません。AFAIK、permgenの割り当ては、JVMランタイムの奥深くで行われ、そこでは取得できません。(クラスローダー自体がpermgenにあるとは思いません。クラスとそのコードを表すJVMの内部データ構造の一部にすぎないと思います。)

アプリケーションが本当にそのように機能する必要がある場合は、permgenを十分に大きくする以外に選択肢はないと思います。(明らかに、実際の問題がpermgenリークではないことも確認する必要があります。)

ただし、多くのクラスとクラスローダーを生成する必要がある場合、アプリケーションのアーキテクチャはかなり奇妙だと思います。私はそれがしていることが他の方法で行うことができないかどうかを見たいと思います。

于 2013-03-20T22:46:47.933 に答える