質問
PermGenの概要、使用目的、失敗の理由、増やす方法などを知っています。
私が知らないのは、PermGenが実際に何を表しているのかということです。パーマネント... Gen ...何か?
PermGenの実際の意味を知っている人はいますか
解決
永久世代。もちろん、詳細は実装固有です。
簡単に言うと、クラスとインターンされた文字列に関連付けられたJavaオブジェクトが含まれています。共有をオンにしたSunのクライアント実装では、 classes.jsa
はメモリマップされて初期データを形成し、約半分が読み取り専用、半分がコピーオンライトです。
単に古い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は、永続世代の略です。
正しく覚えていれば、世代別のガベージコレクターのように、genは世代を表します(若いオブジェクトを中年および「永続的な」オブジェクトとは異なる方法で処理します)。局所性の原理は、最近作成されたオブジェクトが最初に消去されることを示唆しています。
PermgenはPermanent Generationの略です。 JVMメモリ領域の1つです。 MaxPermSizeと呼ばれるフラグを使用して、固定サイズのヒープの一部です。
「PermGen」という名前の理由
このpermgenは、Javaの初期に命名されました。 Permgenメインは、ロードされたクラスのすべてのメタデータを保持します。しかし問題は、クラスがロードされると、JVMがシャットダウンするまでJVMに残ることです。そのため、permgenという名前が最適です。しかし、後に、クラスの動的なロードが登場しましたが、名前は変更されていません。しかし、 Java 8 により、彼らはその問題にも対処しました。 permagen は、動的メモリサイズを使用して MetaSpace に名前が変更されました。