2

8GB RAM があり、64 ビット JVM で以下を使用する場合

  • 最大ヒープサイズ 6144MB
  • 最大パーマ世代スペース 2048MB
  • スタックサイズ 2MB

Q1 : perm gen 領域は最大ヒープから割り当てられますか、それとも別のヒープから割り当てられますか?

Q2 : 別々の場合、上記の設定で jvm が開始されますか、それとも、ヒープ + permgen + スタック + プログラム データが合計 RAM を超えるため、エラーが発生しますか?

4

3 に答える 3

5

まず最初に、設定したパラメーター-Xmx(ヒープ サイズを設定していると思われるため) は、JVM が消費するメモリの量ではなく、Java コードで使用できるヒープのサイズであることを覚えておいてください。違いは、JVM が保持するハウスキーピング構造 (ガベージ コレクター構造、JIT オーバーヘッドなど)、ネイティブ コードによって割り当てられるメモリ、バッファーなどに起因します。この追加メモリのサイズは、JVM のバージョン、実行しているアプリ、およびその他の要因によって異なりますが、JVM がアプリケーションに表示されるヒープ サイズの 2 倍の RAM を割り当てるのを見てきました。平均的なケースでは、通常、50% が安全なマージンであり、20 ~ 30% が許容範囲であると考えています。マシンの RAM の量に近いヒープ サイズを設定すると、スワップにヒットし、パフォーマンスが低下します。

列挙された質問については、次のとおりです。

Perm gen は、少なくとも Oracle の JDK 6 ではヒープとは別の領域です。通常のヒープとはまったく異なるメモリ管理規則が適用されるため、分離されています。ところで、2 GB の pergen スペースは巨大です。本当に必要ですか?

2番目の質問については、上記を参照してください。これが Oracle の JDK である場合、perm と heap が合計されるため、問題が発生する可能性がありますが、通常は 6 GB ヒープの 20 ~ 50% 程度のメモリが追加され、ヒープと perm スペースを合わせると、これはあなたのRAM以上のものになります。最初はこの設定でうまくいくかもしれませんが、ヒープと perm gen の両方のスペースの使用量が設定された制限に近づくと、メモリが不足する可能性があります。

于 2013-03-13T20:19:15.117 に答える
3

heap と permgen は、JVM の異なるメモリ部分です。そのため、システム上のほぼすべてのメモリを消費することになります。OS/その他のタスクが適切に実行されるように、RAM の 20% を空けておくことをお勧めします。

また、perm スペースの 2 GB は膨大な数値です。関連するクラスのみがクラスパスに存在することを意味する jar の最適化を見たことがありますか?

于 2013-03-13T18:59:50.333 に答える
2

これは、JVMとJVMのバージョンによって異なります。

  • Hotspot Java 6では、PermGenスペースは最大ヒープサイズ引数から独立しています(そしてYoung / OldGenサイズのみを制御します)。PermGenのスペースサイズはとで指定されます。Java SE 6HotSpot[tm]仮想マシンのガベージコレクションのチューニングを参照してください-Xmx-Xms-XX:PermSize-XX:MaxPermSize

  • 更新: Hotspot Java 8では、PermGenスペースはなくなり、オブジェクトはYoung /OldGenerationスペースに存在します。

于 2013-03-13T19:43:12.197 に答える