Java JVMで常にPermgenスペースのサイズを制限する目的は何ですか?常に最大ヒープサイズと等しく設定しないのはなぜですか?Java =デフォルトの64MBのように少数ですか?これにより、コード内のpermgenの問題に人々に気付かせようとしていますか?
私のアプリが85MBのpermgenを使用している場合、96MBに設定しても安全かもしれませんが、メインヒープのほんの一部であるのに、なぜそれほど小さく設定するのですか? JVMがヒープの許す限り多くのPermGenを使用できるようにすると効率的ではないでしょうか?
プログラマーにとって概念的には、「永続的な世代」はほとんど無意味であると主張できます。クラスまたは他の「永続的な」データをロードする必要があり、メモリ領域が残っている場合は、原則として、どこかにそれをロードし、これらのアイテムの集合体を「世代」と呼ぶことをまったく気にしないこともできます。
ただし、理論的根拠はおそらくそれ以上です。
だから私が見ているように、恒久的な「世代」を割り当てる理由のほとんどは、プログラマーが本当にひどく気遣うのではなく、実際の実装上の理由によるものです。
一方、状況は通常プログラマーにとってもひどいものではありません。必要な永続的な世代の量は通常予測可能であるため、適切な余裕を持って必要な量を割り当てることができるはずです。したがって、予想外に割り当てを超過していることがわかった場合、これは「重大な問題が間違っている」というシグナルである可能性があります。
N.B.おそらく、PermGenが最初に解決するように設計された問題の一部は、より大きなプロセッサキャッシュを備えた最新の64ビットプロセッサでは、それほど大きな問題ではありません。 Javaの将来のリリースで削除される場合、これはおそらく、JVM設計者が「目的を果たした」と感じている兆候である可能性があります。
PermGenはJDK8で非表示になるように設定されています。
Java JVMのPermgenスペースのサイズを制限する目的は何でしょうか?
リソースを使い果たしていない。
それを常に最大ヒープサイズと等しく設定しないのはなぜですか?
PermGenはnot Javaヒープの一部です。さらに、そうであったとしても、ヒープをクラスで埋めることはアプリケーションにとってあまり役に立ちません。メタデータと定数文字列。代わりに「OutOfMemoryError:Java heap size」エラーが発生します。
PermGenはclassデータおよびその他の静的なもの(文字列リテラルなど)が割り当てられる場所です。
アプリケーションデータ用にメモリをJavaヒープに割り当てたい(Xms
およびXmx
、ここでyoung(存続期間が短い)およびtenuredオブジェクトが移動します(JVMがより長く滞在する必要があることに気付いた場合)。
したがって、歴史的なPermGen 64MBのデフォルトは任意である可能性がありますが、明示的に設定することで、アプリケーションがJVMに格納する静的データの量を知る(および制御する)ことができます。