2016-06-17 16 views
2

Understanding JVM Memory Allocation and Java Out of Memory: Heap Spaceに示すように、ヒープ領域が割り当てられている場合、JVMは物理メモリと仮想メモリを区別しません。 Javaオブジェクトと計算のメモリ割り当てが開始されると、JVMは仮想メモリと物理メモリを区別し始めます。十分なスワップ領域(Linuxマシン上)が与えられた場合、なぜメモリー不足エラーが発生するのでしょうか?非常にゆっくりとはいえ、JVMが単にスワップ空間を使って計算を完了してはいけません。JVMが自動的にスワップ領域を使用してメモリ不足を防ぐことができます

例:RAM:14ギガバイト、スワップ領域:10ギガバイト

Javaアプリケーションはスペースの20ギガバイトを必要とする場合、それはスワップ領域(仮想メモリ)を利用してアプリケーションを実行して完了できませんでしたか?

Javaアプリケーションに関するヒープ領域と仮想メモリの相互作用は何ですか?

+0

私は、JVMがメモリ使用量に境界を設定していると思います。十分なメモリがないわけではありません。アプリケーションが境界を超えていると思いますが、わかりません。 – niceman

+1

Peter Lawreyの答えをリンクした質問?彼はあなたの質問のすべてではないにしても、ほとんどを扱います。 –

+0

はい、私はしました。しかし、私はそれが使用できる十分な仮想メモリがある場合、なぜJavaプロセスがOOMを与えるのか理解できませんでした。 – Raghava

答えて

4

どのように動作するのか分かりません。

プロセス決しては、メモリのどの部分が仮想メモリにあり、どれが物理メモリにあるのかを知りません。

OSによって透過的に管理されます。通常、最もよく使用された、または最近使用された "ブロック"(正しい用語である "ページ")は、物理メモリに保持されます。プログラムは単にメモリを要求し、OSはそれを割り当て、各ページがどこにあるかを決定します(仮想または物理)。

メモリを使用するには、物理​​メモリにページが存在する必要があります。メモリのページを仮想から物理に移動するのはかなり高価なので、回避する必要があります。したがって、通常は、ヒープが物理メモリよりも小さいことを指定して、OSがすべての物理メモリを物理メモリに保持しようとするようにします(OSや他のアプリケーションでは余分な物理メモリを解放する必要があります)。

そして

質問について:

それはあなたが最大で使用するJVMに言った

アプリケーションを実行しているスワップ領域(仮想メモリ)と完全から追加の8ギガバイトを利用できませんでした12 GBのメモリを使用していますが、今はJVMで注文を無視して12 GBを超えて拡張しますか? JVMは優れた人であり、あなたに従っています。良いパフォーマンスを保証するためにメモリ制限を選択するか、ヒープリミットとリスクページングを行わないかを決めるのはあなたです(もちろん、明示的な制限がなくても、ホストマシンのOSとリソース)。

This link provides more information

+0

ありがとうございます。どうすればjvmに以下を指定することができますか?「可能な限り多くのヒープスペースを使用し、アプリケーションの実行を完了するために仮想メモリを使用する」 - ページネーションがあるかどうかは気にしません。目標は、時間の心配なしにアプリケーションの実行を完了することです。アプリケーション/ RAMの統計情報は、この記事の例に記載されています。 – Raghava

+0

私が提供したリンクから: '初期または最大ヒープサイズを設定しないと、GCは必要に応じてヒープを展開および縮小します。ただし、-Xmsオプションと-Xmxオプションを使用してヒープサイズを修正すると、GCはJava™ヒープを拡張または縮小しません。繰り返しますが、**プロセスはメモリ**のみを要求し、OSはそれをどこに割り当てるかを決定します。 – SJuan76

+0

Oracle Java SDKについても同じことが当てはまるとします。a)-Xmsオプションと-Xmxオプションが指定されていない場合、デフォルト値は仮定されません。b)十分な場合はOOMエラーは発生しませんスワップ領域とJavaアプリケーションの物理メモリより多くの領域が必要ですか? – Raghava

2

は、JVMは、単に非常にゆっくりとはいえ、計算を完了するために、スワップ領域を使用しないでください。

ディスクが回転していれば、それは50,000倍以上遅くなることがあります。 GCを実行すると、オブジェクトのGB /秒をスキャンできますが、代わりに1秒あたり100秒のオブジェクトしかスキャンできないと想像してください。これは数秒かかるのではなく、1日程度かかります。注意:これが起こっている間、マシンは使用できなくなります。 Windowsでは、プロセスを終了させることもできず、プロセスの電源を切って停止させることもできません。

私は任意の-Xmx引数を提供し、Javaアプリケーションであれば

を取るようdefualtがメインメモリ以上のものではありません実行できない場合は、これをテストするために私ができるでしょう。最大ヒープサイズをメインメモリよりも大きく設定しても、そのヒープサイズを使用することを意味するわけではありません。最小値も設定する必要があります。

あなたのプロセスが正常に完了したかどうかを確認するには、これは面白いテストかもしれませんが、時間があればそれ以上の時間がかかります。

+0

ありがとうございます。私は利用可能な物理メモリよりも多くのスペースが必要な場合、Javaアプリケーションの時間をテストすることに興味があります。 -Xmx引数を指定せずにjavaアプリケーションを実行するだけで、仮想メモリを使用することを望むなら、これをテストできますか? – Raghava

+0

@Raghava私は自分の答えを更新しました。 –

+0

ありがとうございます。 -Xmxオプションとヒープサイズを指定しないでテストします。 – Raghava

関連する問題