web-dev-qa-db-ja.com

なぜPermGenのデフォルトサイズはとても小さいのですか?

Java JVMで常にPermgenスペースのサイズを制限する目的は何ですか?常に最大ヒープサイズと等しく設定しないのはなぜですか?Java =デフォルトの64MBのように少数ですか?これにより、コード内のpermgenの問題に人々に気付かせようとしていますか?

私のアプリが85MBのpermgenを使用している場合、96MBに設定しても安全かもしれませんが、メインヒープのほんの一部であるのに、なぜそれほど小さく設定するのですか? JVMがヒープの許す限り多くのPermGenを使用できるようにすると効率的ではないでしょうか?

18
djangofan

プログラマーにとって概念的には、「永続的な世代」はほとんど無意味であると主張できます。クラスまたは他の「永続的な」データをロードする必要があり、メモリ領域が残っている場合は、原則として、どこかにそれをロードし、これらのアイテムの集合体を「世代」と呼ぶことをまったく気にしないこともできます。

ただし、理論的根拠はおそらくそれ以上です。

  • すべてのコード/クラスメタデータをメモリスペースに近づけることで(たとえば、プロセッサキャッシュの観点から)潜在的に利点があり、これを保証するには、固定サイズの領域を割り当てる方が簡単です。
  • 同様に、コード/クラスメタデータが格納されているメモリスペースには、特定の「特別な」プロパティが含まれている可能性があり(特に、手助けできるのであれば、ディスクにページアウトされたくない)、システムがそのようなプロパティを設定できない場合があります。 1つの(または少数の)連続するブロックまたはメモリ空間にすべての「特別な」オブジェクトをまとめることがより実用的であるように、非常に細かい方法でメモリ上に。
  • 永続オブジェクトをすべてまとめることで、残りのメモリ領域の断片化を回避できます。これを行う最も実際的な方法は、最初から固定サイズのメモリの1つの連続したブロックを割り当てることです。

だから私が見ているように、恒久的な「世代」を割り当てる理由のほとんどは、プログラマーが本当にひどく気遣うのではなく、実際の実装上の理由によるものです。

一方、状況は通常プログラマーにとってもひどいものではありません。必要な永続的な世代の量は通常予測可能であるため、適切な余裕を持って必要な量を割り当てることができるはずです。したがって、予想外に割り当てを超過していることがわかった場合、これは「重大な問題が間違っている」というシグナルである可能性があります。

N.B.おそらく、PermGenが最初に解決するように設計された問題の一部は、より大きなプロセッサキャッシュを備えた最新の64ビットプロセッサでは、それほど大きな問題ではありません。 Javaの将来のリリースで削除される場合、これはおそらく、JVM設計者が「目的を果たした」と感じている兆候である可能性があります。

12
Neil Coffey

PermGenはJDK8で非表示になるように設定されています。

Java JVMのPermgenスペースのサイズを制限する目的は何でしょうか?

リソースを使い果たしていない。

それを常に最大ヒープサイズと等しく設定しないのはなぜですか?

PermGenはnot Javaヒープの一部です。さらに、そうであったとしても、ヒープをクラスで埋めることはアプリケーションにとってあまり役に立ちません。メタデータと定数文字列。代わりに「OutOfMemoryError:Java heap size」エラーが発生します。

14
Frank Pavageau

PermGenはclassデータおよびその他の静的なもの(文字列リテラルなど)が割り当てられる場所です。

アプリケーションデータ用にメモリをJavaヒープに割り当てたい(XmsおよびXmx、ここでyoung(存続期間が短い)およびtenuredオブジェクトが移動します(JVMがより長く滞在する必要があることに気付いた場合)。

したがって、歴史的なPermGen 64MBのデフォルトは任意である可能性がありますが、明示的に設定することで、アプリケーションがJVMに格納する静的データの量を知る(および制御する)ことができます。

3
Faiz