18

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

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

4

3 に答える 3

14

PermGenはJDK8で消えるように設定されています。

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

リソースを使い果たしていません。

常に最大ヒープサイズと同じに設定しないのはなぜですか?

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

于 2012-11-20T01:16:07.730 に答える
13

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

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

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

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

一方、プログラマーにとっても状況は通常ひどいものではありません。必要な永続的な生成の量は通常予測可能であるため、必要な量を適切な余裕を持って割り当てることができるはずです。したがって、予期せず割り当てを超えていることに気付いた場合、これは「重大な問題が発生している」ことを示している可能性があります。

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

于 2012-11-20T01:15:44.537 に答える
3

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

むしろ、アプリケーションデータ用にJavaヒープにメモリを割り当てたいと思います(XmsそしてXmx若い(短命の)オブジェクトと古いオブジェクトが移動する場所(JVMがそれらがより長くとどまる必要があることを認識したとき))。

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

于 2012-11-20T01:25:11.760 に答える