Java Memory Management でドキュメントを調べていたところ、理解できないPermSizeに遭遇しました。このドキュメントには、「JVMはそのメタデータを保存します」と書かれていますが、メタデータの意味を正確に把握できませんでした。私はグーグルで、どこかで読んだ値オブジェクト(ユーザー定義オブジェクト)を格納します。
どんな種類のオブジェクトがそこに保存されていますか?説明付きの例は素晴らしいでしょう。
「永久世代」の簡単な定義:
「永続世代は、クラスオブジェクトやメソッドオブジェクトなどのVM自体の反射データを保持するために使用されます。これらの反射オブジェクトは、永続世代に直接割り当てられます。世代。 " [ref]
言い換えれば、これがクラス定義の行き先です(そして、これはアプリケーションが多数のクラスをロードする場合や再デプロイ時にメッセージOutOfMemoryError: PermGen space
を受け取る理由を説明します)。
PermSize
は、JVMオプションでユーザーが設定した-Xmx
値に追加されることに注意してください。ただし、MaxPermSize
は、JVMがPermSize
を指定された量まで拡張できるようにします。最初にVMがロードされると、MaxPermSize
はデフォルト値のままになります(-client
の場合は32mb、-server
の場合は64mb)一方、PermSize
とMaxPermSize
の両方を256mbに設定すると、 -Xmx
設定に加えて、全体のヒープが256mb増加しました。
このブログ投稿 は、素敵な説明と背景を提供します。基本的に、「パーマネントジェネレーション」(サイズはPermSizeで指定)は、JVMがスペースを割り当てる必要があるものを格納するために使用されますが、(通常)ガベージコレクションされない(したがって「パーマネント」)(+)。つまり、たとえばロードされたクラスと静的フィールドを意味します。
また、Sunから直接 ガベージコレクションに関するFAQ があり、永続的な世代に関するいくつかの質問に答えています。最後に、多くの技術的な詳細を含む ブログ投稿 を示します。
(+)実際には、パーマネント世代の一部はGCされます。クラスがアンロードされると、クラスオブジェクトは削除されます。しかし、永続世代がJVMに導入されたとき、それは珍しいことでした。
パーマメントプールには、アプリケーションデータではなく、VMに必要なものがすべて含まれています。通常、インターンされた文字列、定義されたクラスのバイトコード、およびその他の「自分のものではない」データが含まれます。
ロードされたクラス定義とメタデータを保存するレース。大規模なコードベースプロジェクトがロードされる場合、Perm Genのサイズが不十分であるため、一般的なJava.Lang.OutOfMemoryError:PermGenが発生します。