8GB RAM があり、64 ビット JVM で以下を使用する場合
- 最大ヒープサイズ 6144MB
- 最大パーマ世代スペース 2048MB
- スタックサイズ 2MB
Q1 : perm gen 領域は最大ヒープから割り当てられますか、それとも別のヒープから割り当てられますか?
Q2 : 別々の場合、上記の設定で jvm が開始されますか、それとも、ヒープ + permgen + スタック + プログラム データが合計 RAM を超えるため、エラーが発生しますか?
8GB RAM があり、64 ビット JVM で以下を使用する場合
Q1 : perm gen 領域は最大ヒープから割り当てられますか、それとも別のヒープから割り当てられますか?
Q2 : 別々の場合、上記の設定で jvm が開始されますか、それとも、ヒープ + permgen + スタック + プログラム データが合計 RAM を超えるため、エラーが発生しますか?
まず最初に、設定したパラメーター-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 の両方のスペースの使用量が設定された制限に近づくと、メモリが不足する可能性があります。
heap と permgen は、JVM の異なるメモリ部分です。そのため、システム上のほぼすべてのメモリを消費することになります。OS/その他のタスクが適切に実行されるように、RAM の 20% を空けておくことをお勧めします。
また、perm スペースの 2 GB は膨大な数値です。関連するクラスのみがクラスパスに存在することを意味する jar の最適化を見たことがありますか?
これは、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スペースに存在します。