PermGen とは何か、何に使用されるのか、なぜ失敗するのか、どのように増やすのかなどを知っています。
私が知らないのは、PermGen が実際に何を表しているかです。永久... ゲン... 何か?
PermGenが実際に何を表しているか知っている人はいますか?
永久世代。詳細はもちろん実装固有です。
簡単に言えば、クラスとインターンされた文字列に関連付けられた Java オブジェクトが含まれています。共有をオンにした Sun のクライアント実装でclasses.jsa
は、約半分が読み取り専用で半分がコピー オン ライトで、初期データを形成するためにメモリ マップされます。
単に古い Java オブジェクトは、Tenured 世代に保持されます。
PermGen は、ロードされたクラスを保持するために JVM によって使用されます。次を使用して増やすことができます。
-XX:MaxPermSize=384m
Sun JVM または OpenJDK を使用している場合。
したがって、OutOfMemoryException: PermGen が発生した場合は、PermGen を大きくするか、クラス ローダーの問題が発生している可能性があります。
永久世代。ガベージ コレクタの詳細については、Java GC チューニング ガイドを参照してください。
元の質問とはあまり関係ありませんが、誰かが役に立つと思うかもしれません。PermGen は実際、Java がそのクラスを保持していたメモリ内の領域です。そのため、たとえば多くのクラスがあった場合、PermGen で OOM に出くわしたことがあるでしょう。
Java 8 以降、PermGen 領域は MetaSpace 領域に置き換えられました。これはより効率的で、デフォルトで無制限です (より正確には、32 ビットまたは 64 ビットの jvm と OS 仮想メモリの可用性に応じて、ネイティブ メモリの量によって制限されます)。ただし、領域の最大制限を指定するなど、いくつかの方法で調整することができます。このブログ投稿で、より役立つ情報を見つけることができます。
PermGen はPermanent Generationの略です。
DDJの簡単な宣伝文句はこちら
私の記憶が正しければ、ジェネレーション ガベージ コレクターのように、gen はジェネレーションを表します (これは、若いオブジェクトを寿命の短いオブジェクトや「永続的な」オブジェクトとは異なる方法で扱います)。局所性の原則は、最近作成されたオブジェクトが最初に消去されることを示唆しています。