2009-10-27 7 views
59

私はJava Memory Managementの文書を調べていましたが、私が理解できなかったPermSizeを見つけました。このドキュメントには、「JVMはそのメタデータを格納します」というメッセージが格納されていますが、メタデータの意味を正確に把握することはできませんでした。私はグーグルで、どこかに値のオブジェクト(ユーザー定義のオブジェクト)が格納されていると読んでいました。Javaで 'PermSize'とは何ですか?

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

+0

64ビットVMのデフォルト値は64mです。私たちは8レールのアプリケーションを実行しているtomcatサーバーの場合、これを '512m 'に増やしました。'-XX:MaxPermSize = 512m -XX:PermSize = 512m'となります。多くのクラス定義を持つTomcat自体は大きなPerSizeを必要とし、ruby、ruby、jrubyと組み合わされたレールには巨大なPermSizeが必要です。 –

+2

Permanent Generation(およびPermSizeパラメータとともに)はJava 8で廃止されています。これらは「Metaspace」に置き換えられています。 http://javaeesupportpatterns.blogspot.co.uk/2013/02/java-8-from-permgen-to-metaspace.htmlを参照してください。 – sleske

答えて

100

「永久世代」の迅速な定義:

「永久的な生成が に使用されるこれらの反射物体は なるようクラスオブジェクト及び方法 オブジェクトとしてVM自体 の反射データを保持します。パーマネント 世代に直接割り当てられており、他の 世代とは独立して、サイズが です。言い換えれば[ref]

クラス定義が行く(およびアプリケーションおよび/または再展開に多数のクラスをロードする場合は、メッセージOutOfMemoryError: PermGen spaceを得ることが、なぜこれが説明)ここで、これがあります。 PermSizeは、JVMオプションのユーザによって設定-Xmx値への追加であることを

注意。しかしMaxPermSizeは、JVMが指定された量までPermSizeを成長させることを可能にします。最初にVMがロードされたときには、MaxPermSizeがデフォルト値(-clientの場合は32MB、-serverの場合は64MB)になりますが、必要になるまで実際にはその量を消費しません。あなたは256メガバイトにPermSizeMaxPermSizeの両方を設定した場合一方、あなたは全体のヒープが-Xmx設定に追加の256メガバイト増加していることに気づくでしょう。

9

永久プールには、アプリケーションデータではなく、VMに必要なものがすべて含まれています。通常、内部文字列、定義されたクラスのバイトコード、その他のデータではありません。

22

This blog postは素晴らしい説明と背景を示します。基本的に、JVMがスペースを割り当てる必要があるが、(通常は)ガベージコレクションされない(したがって永続的な)(+)ものを格納するためには、 "Permanent Generation"(サイズはPermSizeによって与えられる)が使用されます。これは、例えばロードされたクラスと静的フィールドを意味します。

また、Sunから直接FAQ on garbage collectionがあり、永久世代に関するいくつかの質問に答えています。最後に、ここには多くの技術的な詳細があるblog postがあります。

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

関連する問題