回答:
永久的な世代。詳細はもちろん実装固有です。
簡単に言うと、クラスとインターンされた文字列に関連付けられたJavaオブジェクトが含まれています。共有がオンになってclasses.jsa
いるSunのクライアント実装では、メモリがマッピングされて初期データが形成され、約半分が読み取り専用で、半分がコピーオンライトです。
単に古いJavaオブジェクトはTenured Generationに保持されます。
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の簡単な説明があります
Permgenは、Permanent Generationの略です。これは、JVMメモリー領域の1つです。これは、MaxPermSizeと呼ばれるフラグを使用することにより、固定サイズのヒープの一部です。
なぜ「PermGen」という名前なのですか?
このpermgenは、Javaの初期の頃に命名されました。Permgenメインは、ロードされたクラスのすべてのメタデータを保持します。しかし問題は、いったんクラスがロードされると、JVMがシャットダウンするまでそのクラスがJVMに残ることです。そのため、名前permgenがそれを選びます。しかし、後で、クラスの動的ロードが登場しましたが、名前は変更されませんでした。しかし、Java 8では、その問題にも対処しています。今permagenと改名されたメタスペース動的メモリサイズで。