0

この質問はJava Refuses To Start - Could Not Resrve Enough Space for Object Heapに関連しており、簡単に理解できるはずです。でも; 私の検索では、有用なものは何も得られませんでした。

基本的に、同じハードウェアの異なるマシンに 2 つの 32 ビット OS (RedHat と SuSE) があります。どちらも同じ JVM を使用し、同じコマンド ラインを実行します。RedHat は問題なく動作しますが、SuSE は十分なメモリがないと報告します。

これが使用している SuSE のバージョンの制限なのか、それとも別の問題なのかを知る必要があります。

「cat /proc/version」は次のようになります。

Linux version 2.6.5-7.244-bigsmp (geeko@buildhost) (gcc version 3.3.3 (SuSE Linux)) #1 SMP Mon Dec 12 18:32:25 UTC 2005

「uname -a」を実行すると、両方のタイプのマシンで次の結果が得られます。

UTC 2005 i686 i686 i386 GNU/Linux
4

2 に答える 2

2

JVM メモリ制限は、空きメモリの量ではなく、利用可能な最大の空き連続ブロックに関連しています。制限は、約 1.4 GB から 2.0 GB 強までさまざまで、オペレーティング システムがさまざまなものをメモリ内のどこに配置するかによって異なります。RedhatまたはSuseがメモリにロードする場所の詳細はわかりませんが、suseがいくつかのライブラリをRAMの真ん中のアドレスにマッピングし、Redhatが最後にそれをマッピングする可能性があります(推測)。

また、Java での実際のメモリ使用量は、Xmx で指定したものより多いことに注意してください。他のメモリ設定もヒープのサイズに影響します (permgen など)。そのため、Suse の perm スペースのデフォルトが Redhat よりも大きい可能性もあります。

また、アプリケーションのメモリ割り当てプロファイルによっては、ヒープ サイズを小さくし、さまざまなガベージ コレクション オプションを使用することもできます。詳細はこちら ( http://java.sun.com/performance/reference/whitepapers/tuning.html ) およびその他の場所にあります。たとえば、小さな一時ブロックを多数割り当てる場合は、少し長命のオブジェクトが多数ある場合とは異なる GC 設定が必要になります。

リンクされた質問に関して、なぜ Redhat を使用しないのですか? これは単純な解決策かもしれませんが、Java のチューニングや OS メモリ管理の難解な世界を深く掘り下げるよりも、問題をより迅速に解決できることを保証します :P

于 2009-06-29T20:30:42.880 に答える
0

第一に、これほど多くのアドレス空間のプレッシャーがあるときに 32 ビット OS を実行するのは気が狂っています。64 ビット Linux 上の 64 ビット JVM に移行します。64 ビット システムのより大きなアドレス空間で解決されると最初から疑っていたに違いないこの問題を診断しようとして、すでにどれだけの時間を無駄にしましたか?

第二に、すべての Linux ベンダーの中で Red Hat が最も多くのカーネル エンジニアをスタッフに抱えており、RHEL 製品のカーネルにいくつかの重大な調整を行っていることはよく知られています。これらには、多くの場合、あなたのような大規模なワークロード用のパッチが含まれています (まあ、これは 32 ビット システムの大きなワークロードであり、64 ビットでは特別なことではありません)。したがって、最終的には、RHEL には他の顧客があなたと同じクレイジーなことをしており、それらの顧客をサポートするために彼らが行った仕事から利益を得ている可能性があります。

最後に、32 ビットの SuSE でこれを行う方法を見つけようとしていると思われるので、Linux は 32 ビットの x86 でさまざまなアドレス空間のトレードオフを提供していることを指摘しておきます。それは可能です。 (確かではありませんが) あなたの SuSE システムでは異なるトレードオフが選択されているだけです。実行中のカーネルの構成 (多くの場合 /boot/config.... にあります) を表示できる場合は、HIGHMEM などの設定を比較できます。

数年前までの従来のオプションは 2:2 分割でした。つまり、ユーザー空間は 2GiB のアドレス空間に制限されており、プログラムするのが簡単なソリューションであり、適切な効率がありますが、このシナリオでは、要求されたヒープを取得できないことは明らかです。プログラムテキスト、スタックなどのためのスペースを残しません。最近の傾向は 3:1 (Windows の /3GB スイッチに似ています) であり、OS カーネル自体をより少ないスペースに詰め込むという犠牲を払ってユーザー空間のアドレス空間を拡張します。独自の問題を引き起こします。これはうまくいくかもしれませんが、非常に窮屈になるので、あなたの仕事にうまくいかなくても驚かないでしょう. 最後に、新しい Linux カーネルは、4GiB 32 ビットのユーザー空間を取得するオプションも提供します。これは、ジョブを確実に実行するのに十分な場合があります。

これを試すには、新しいカーネルが必要です。SuSE が提供するものをインストールするだけでよい場合もあれば (たとえば、「PAE」オプションなど、他に選択肢があるかどうかを確認してください)、独自にコンパイルする必要がある場合もあります。その場合、サポート契約が無効になる可能性があります。

しかし、実際には、オプション 1 を使用して、64 ビット JVM に切り替えて、準備を整える必要があります。

于 2009-06-29T21:11:38.820 に答える