105

私は常に、32ビットのWindows XP(Java 1.4、1.5、および1.6)で実行されているJavaSEに1400メガバイトを割り当てることができました。

java -Xmx1400m ...

今日、Java1.5_16と1.6.0_07を使用する新しいWindowsXPマシンで同じオプションを試しましたが、エラーが発生しました。

Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

試行錯誤の結果、このマシンに割り当てることができるのは1200メガバイトが最も多いようです。

あるマシンが1400を許可し、別のマシンが1200しか許可しない理由はありますか?

編集:マシンには、Windowsが認識できる約3.5GBのRAMが4GBあります。

4

13 に答える 13

129

Windows には仮想メモリ管理があり、JVMはそのアドレス空間で連続するメモリのみを必要とすることに注意してください。そのため、システムで実行されている他のプログラムが必ずしもヒープ サイズに影響を与えるとは限りません。邪魔になるのは、アドレス空間に読み込まれる DLL です。残念ながら、リンク中の DLL の再配置を最小限に抑える Windows の最適化により、アドレス空間が断片化される可能性が高くなります。通常のものとは別に、アドレス空間に侵入する可能性が高いものには、セキュリティ ソフトウェア、CBT ソフトウェア、スパイウェア、およびその他の形態のマルウェアが含まれます。差異の原因として考えられるのは、セキュリティ パッチや C ランタイムのバージョンの違いなどです。デバイス ドライバーやその他のカーネル ビットには、独自のアドレス空間 (4GB の 32 ビット空間の残りの 2GB) があります。

JVM プロセスで DLL バインディングを調べて、DLL をよりコンパクトなアドレス空間にリベースすることを検討できます。面白くないけど必死なら…

または、64 ビット Windows と 64 ビット JVM に切り替えることもできます。他の人が提案したことにもかかわらず、それはより多くの RAM を食いつぶしますが、より多くの連続した仮想アドレス空間を持ち、連続して 2GB を割り当てることは簡単です。

于 2009-01-31T00:02:39.267 に答える
51

これは、連続したメモリに関係しています。

おそらく「VM神」から、以前に誰かがそれを尋ねたためにオンラインで見つけた情報を次に示します。

ヒープに連続したメモリ領域が必要な理由は、ヒープの先頭からの (スケーリングされた) オフセットによってインデックス付けされた一連のサイド データ構造があるためです。たとえば、512 バイトのヒープごとに 1 バイトを持つ「カード マーク配列」を使用して、オブジェクト参照の更新を追跡します。参照をヒープに格納するときは、カード マーク配列内の対応するバイトをマークする必要があります。ストアの宛先アドレスを右シフトし、それを使用してカード マーク配列のインデックスを作成します。Java ではできない、C++ でプレイできる算術ゲームの楽しいアドレス指定。

通常、適度な連続領域 (Windows では最大約 1.5 GB、Solaris YMMV では最大約 3.8 GB) を取得するのに問題はありません。Windows では、ほとんどの問題は、JVM が起動する前にロードされ、アドレス空間を分割するいくつかのライブラリがあることです。/3GB スイッチを使用してもこれらのライブラリはリベースされないため、依然として問題です。

チャンク ヒープを作成する方法はわかっていますが、それらを使用するとオーバーヘッドが発生します。32 ビット JVM でのより大きなヒープよりも高速なストレージ管理の要求が多くあります。本当に大きなヒープが必要な場合は、64 ビット JVM に切り替えてください。連続したメモリが必要ですが、64 ビットのアドレス空間を取得する方がはるかに簡単です。

于 2009-01-31T01:26:14.917 に答える
20

Windows の Java ヒープ サイズの制限は次のとおりです。

  • 32 ビット Java で可能な最大ヒープ サイズ: 1.8 GB
  • 32 ビット Java で推奨されるヒープ サイズの制限: 1.5 GB (または/3GB オプションを使用すると1.8 GB )

これは、より大きな Java ヒープを取得するのに役立ちませんが、これらの値を超えることはできないことがわかりました。

于 2009-01-31T01:56:39.190 に答える
10

非連続ヒープを処理できるOracle JRockitは、Windows 2003/XP で /3GB スイッチを使用して 2.85 GB の Java ヒープ サイズを持つことができます。断片化は、Java ヒープの大きさに大きな影響を与える可能性があるようです。

于 2009-02-01T22:25:58.490 に答える
6

JVM は連続したメモリを必要とし、他に何が実行されているか、以前に実行されていたもの、および Windows がメモリを管理する方法に応じて、最大 1.4GB の連続したメモリを取得できる場合があります。64 ビット Windows では、より大きなヒープが許可されると思います。

于 2008-10-05T04:26:43.780 に答える
6

Sun の JVM には連続したメモリが必要です。したがって、使用可能なメモリの最大量は、メモリの断片化によって決まります。特に、ドライバーの dll は、定義済みのベース アドレスにロードするときに、メモリを断片化する傾向があります。そのため、ハードウェアとそのドライバーによって、取得できるメモリの量が決まります。

これに関する 2 つの情報源 (Sun のエンジニアからの声明を含む):フォーラム ブログ

多分別のJVM?ハーモニーを試しましたか?非連続メモリを許可することを計画していたと思います。

于 2008-10-06T19:59:41.790 に答える
3

私はそれがこの応答によって示唆されるようにWindowsがどのように構成されているかともっと関係があると思います: Java -Xmx Option

さらにいくつかのテスト:768MBの物理RAM(および仮想メモリ)のみを備えた古いWindowsXPマシンに1300MBを割り当てることができました。私の2GBRAMマシンでは、1220MBしか取得できません。他のさまざまな企業のマシン(古いWindows XPを使用)では、1400MBを取得できました。1220MBの制限があるマシンはかなり新しい(Dellから購入したばかり)ので、おそらく新しい(そしてより肥大化した)WindowsとDLL(Windows XPProバージョン2002SP2を実行している)があります。

于 2008-10-05T23:48:23.060 に答える
2

(メモリが限られている) virtuozzo VPS から Java プログラムを実行すると、このエラー メッセージが表示されました。私はメモリ引数を指定していませんでしたが、デフォルトが高すぎるに違いないため、明示的に少量を設定する必要があることがわかりました。例 -Xmx32m (実行するプログラムに応じて調整する必要があることは明らかです)。

質問者のように大量のメモリを指定せずに他の誰かが上記のエラーメッセージを受け取った場合に備えて、これをここに置いてください。

于 2011-04-07T02:38:34.230 に答える
1

巨大なブロックを割り当てる場合、sun の JDK/JRE は連続した量のメモリを必要とします。

OS と最初のアプリは、ロード中にビットとピースを割り当てる傾向があり、利用可能な RAM を断片化します。連続ブロックが使用できない場合、SUN JDK はそれを使用できません。Bea (Oracle が買収) の JRockit は、断片からメモリを割り当てることができます。

于 2008-10-05T05:09:02.603 に答える
1

誰もが連続したメモリについて答えているようですが、より差し迫った問題を認めることを怠っています.

100% の連続したメモリ割り当てがあっても、32 ビット Windows OS で 2 GiB のヒープ サイズを使用することはできません (*既定)。これは、32 ビット Windows プロセスが 2 GiB を超えるスペースをアドレス指定できないためです。

Java プロセスには、 perm gen (Java 8 より前)、スレッドあたりのスタック サイズ、JVM/ライブラリのオーバーヘッド (ビルドごとにかなり増加します)がすべて含まれ、さらに heap も含まれます。

さらに、JVM フラグとそのデフォルト値はバージョン間で異なります。以下を実行するだけで、いくつかのアイデアが得られます。

 java -XX:+PrintFlagsFinal

オプションの多くは、ヒープ内外のメモリ分割に影響します。その 2 GiB の多かれ少なかれ、遊ぶためにあなたを残します...

私のこの回答の一部を再利用するには(Tomcatについてですが、Javaプロセスに適用されます):

Windows OS では、32 ビット プロセスのメモリ割り当てが合計で 2 GiB に制限されています (デフォルト)。

プロセスには他のメモリが割り当てられているため (JVM/ライブラリのオーバーヘッド、perm gen 領域など)、約 1.5 GiB のヒープ領域しか割り当てることができません。

32 ビット Windows では 2 GB のプロセス アドレス空間制限が課されるのに、64 ビット Windows では 4 GB 制限が課されるのはなぜですか?

他の最新のオペレーティング システム [Cough Linux] では、32 ビット プロセスが 4 GiB のアドレス指定可能な空間のすべて (またはほとんど) を使用できます。

つまり、64 ビット Windows OS は、32 ビット プロセスの制限を 4 GiB (32 ビットでは 3 GiB) に増やすように構成できます。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx

于 2015-06-12T16:17:53.747 に答える
0

ページングサイズを増やす方法は次のとおりです

  1. マイコンピュータを右クリック--->プロパティ--->詳細設定
  2. パフォーマンスセクションで設定をクリックします
  3. 詳細タブをクリックします
  4. [仮想メモリ] セクションで、[変更] をクリックします。現在のページング サイズが表示されます。
  5. HDD の空き容量があるドライブを選択します。
  6. 初期サイズと最大サイズを指定します。たとえば、初期サイズ 0 MB と最大サイズ 4000 MB です。(必要な分だけ)
于 2012-12-17T21:25:44.450 に答える
-1

まず、4 GB の RAM がある場合にページ ファイルを使用しても意味がありません。Windows は 4GB を超えてアクセスできない (実際には、メモリ ホールのためそれより少ない) ため、ページ ファイルは使用されません。

次に、アドレス空間が 2 つに分割され、半分がカーネル用、半分がユーザー モード用です。アプリケーションにさらに RAM が必要な場合は、boot.ini で /3GB オプションを使用します (java.exe が「ラージ アドレス対応」としてマークされていることを確認してください (詳細については Google を参照))。

3 つ目は、Java が内部で (スレッド、JIT コンパイラ、VM 初期化などのために) メモリを浪費するため、2 GB のアドレス空間をすべて割り当てることはできないと思います。詳細については、/3GB スイッチを使用してください。

于 2009-02-02T23:03:48.197 に答える