質問

この質問は以下に関連しています Java の起動が拒否される - オブジェクト ヒープに十分なスペースを確保できませんでした 簡単に理解できるはずです。しかし;私の検索では有用なものは何も得られませんでした。

基本的に、同じハードウェアを備えた異なるマシン上に 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
役に立ちましたか?

解決

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

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

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

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

他のヒント

まず、アドレス空間がこれほど圧迫されているときに 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 カーネルでは、4 GiB の 32 ビット ユーザー空間を取得するオプションも提供しています。これは、ジョブを確実に実行するには十分かもしれませんが、明らかにユーザー空間とカーネル アドレスは共存できないため、大幅なパフォーマンス コストがかかります。

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

しかし実際には、オプション 1 を選択し、64 ビット JVM に切り替えて、しっかりと取り組むべきです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top