web-dev-qa-db-ja.com

Javaの「PermSize」とは何ですか?

Java Memory Management でドキュメントを調べていたところ、理解できないPermSizeに遭遇しました。このドキュメントには、「JVMはそのメタデータを保存します」と書かれていますが、メタデータの意味を正確に把握できませんでした。私はグーグルで、どこかで読んだ値オブジェクト(ユーザー定義オブジェクト)を格納します。

どんな種類のオブジェクトがそこに保存されていますか?説明付きの例は素晴らしいでしょう。

65
Anand

「永久世代」の簡単な定義:

「永続世代は、クラスオブジェクトやメソッドオブジェクトなどのVM自体の反射データを保持するために使用されます。これらの反射オブジェクトは、永続世代に直接割り当てられます。世代。 " [ref]

言い換えれば、これがクラス定義の行き先です(そして、これはアプリケーションが多数のクラスをロードする場合や再デプロイ時にメッセージOutOfMemoryError: PermGen spaceを受け取る理由を説明します)。

PermSizeは、JVMオプションでユーザーが設定した-Xmx値に追加されることに注意してください。ただし、MaxPermSizeは、JVMがPermSizeを指定された量まで拡張できるようにします。最初にVMがロードされると、MaxPermSizeはデフォルト値のままになります(-clientの場合は32mb、-serverの場合は64mb)一方、PermSizeMaxPermSizeの両方を256mbに設定すると、 -Xmx設定に加えて、全体のヒープが256mb増加しました。

106
Pascal Thivent

このブログ投稿 は、素敵な説明と背景を提供します。基本的に、「パーマネントジェネレーション」(サイズはPermSizeで指定)は、JVMがスペースを割り当てる必要があるものを格納するために使用されますが、(通常)ガベージコレクションされない(したがって「パーマネント」)(+)。つまり、たとえばロードされたクラスと静的フィールドを意味します。

また、Sunから直接 ガベージコレクションに関するFAQ があり、永続的な世代に関するいくつかの質問に答えています。最後に、多くの技術的な詳細を含む ブログ投稿 を示します。

(+)実際には、パーマネント世代の一部はGCされます。クラスがアンロードされると、クラスオブジェクトは削除されます。しかし、永続世代がJVMに導入されたとき、それは珍しいことでした。

23
sleske

パーマメントプールには、アプリケーションデータではなく、VMに必要なものがすべて含まれています。通常、インターンされた文字列、定義されたクラスのバイトコード、およびその他の「自分のものではない」データが含まれます。

9
ankon

ロードされたクラス定義とメタデータを保存するレース。大規模なコードベースプロジェクトがロードされる場合、Perm Genのサイズが不十分であるため、一般的なJava.Lang.OutOfMemoryError:PermGenが発生します。

0
Appesh