20

この質問を提起するための一般的な方法を長い間考えた後(そしてそれを見つけることができませんでした)、具体的な例としてそれを尋ねるつもりです:

プロセスに割り当てることができる1 Gbのメモリを持つLinuxマシンがあるとします(物理およびスワップの合計1 Gb)。

標準の Oracle Hotspot JVM バージョン 7 がマシンにインストールされています。ある時点で、その 1 Gb のうち 400 Mb だけが空いているような十分な数のプログラムが実行されている場合、その時点で次の JVM フラグを使用して Java プログラムを開始します。

java -Xms256m -Xmx512m -jar myJar.jar

何が起こる?:

A. JVM は、512 Mb のメモリをすべて割り当てようとして失敗するため、すぐに開始できませんか?

JVM が起動した場合:

ある時点で、実行中の Java プロセスが 400 Mb を超えるメモリを必要とする場合 (現在の Java プロセスが既に使用しているもの以外に、空きメモリがまだ 400 Mb しかない場合)、何が起こるか:

B. Java プロセスは OutOfMemroyError で失敗しますか?

C. 他の (標準) エラーで失敗しますか?

D. 未定義の動作ですか?

4

5 に答える 5

10

-Xmx は、ヒープの最大サイズを定義するだけです。メモリが多すぎるかどうかは保証されません。ヒープが指定された値よりも大きくならないことを保証するだけです。そうは言っても、オプション B.) が発生すると、outOfMemoryError がスローされます。

于 2012-11-07T13:44:38.887 に答える
6

プロセスに割り当てることができる1 Gbのメモリを持つLinuxマシンがあるとします(物理およびスワップの合計1 Gb)。

私の最初の反応は、あなたが電話について話しているのでない限り、私はより多くのメモリを手に入れるだろうということです. 100 ドル未満で 16 GB (b = ビット、B = バイト) を購入できます。

JVM は、512 Mb のメモリをすべて割り当てようとして失敗するため、すぐに起動できませんか?

これは、システムが起動時にヒープに使用される継続的な仮想メモリを割り当てるため、システムに 512 MB (およびいくらかのオーバーヘッド) がない場合に発生する可能性があります。

550 MB の空き容量がある場合でも、ヒープ以上のものをロードする必要があるため、プログラムは起動に失敗する可能性があります。

Java プロセスは OutOfMemoryError で失敗しますか?

これは、マシンのメモリ量に関係なく、実行中にプログラムが 512 MB を使用する場合に発生する可能性があります。このエラーは、JVM の開始後にのみ発生します。起動できない場合、このエラーは発生しません。

他の(標準)エラーで失敗しますか?

これは、プログラムの開始後にスワップ領域が不足した場合に発生する可能性があります。これはまれであり、過負荷のマシンでのみ発生します。私が見たのは、低レベルの OS がメモリを割り当てられなかったために JVM がクラッシュしたことです。

Java 6 Update 25 VM クラッシュ: メモリ不足

于 2012-11-07T13:43:23.193 に答える
2

空き領域がアイドル状態の JVM を維持することさえできないほど多くのメモリが占​​有されている場合、プログラムに十分なメモリがないというエラーが発生するか、JVM がクラッシュします。

JVM を実行できる場合は、-Xmx でヒープ領域の制限を指定できます。これは、起動時にすべてのヒープが JVM によって割り当てられるという意味ではありません。これは内部的な制限にすぎません。JVM がヒープ スペースを増やしたいが、十分なメモリがない場合、または -Xmx で指定されたよりも多くのヒープが必要な場合は、現在実行中の Java プログラムで OutOfMemoryError が発生します。

非常に極端な状況では、JVM の実行中に空きメモリが不足する可能性があり、同時に JVM はその内部操作 (ヒープ領域ではなく) により多くのメモリを必要とします。何も取得できず、終了するか、完全にクラッシュします。

于 2012-11-07T13:50:55.057 に答える
2

OutOfMemroyError「Java 仮想マシンがメモリ不足のためにオブジェクトを割り当てることができず、ガベージ コレクタによって使用できるメモリがなくなった場合にスローされます。

したがって、本質的には、「B. Java プロセスは " で失敗しOutOfMemroyErrorます

于 2012-11-07T13:42:55.120 に答える
1

JVM プロセスは仮想メモリで実行されるため、実行中の他のプロセスの割り当ての問題は関係がありますが、完全に決定的なものではありません。

JVM が (何らかの理由で) より多くのメモリを割り当てることができない場合、プロセス自体は終了せず、JVM の外部ではなく、JVMOutOfMemoryError 内でスローを開始します。つまり、JVM は引き続き実行されますが、JVM 内で実行されているプログラムは通常、失敗します。これは、ほとんどのプログラムがメモリ不足の状態を適切に処理できないためです。このかなり一般的なケースでは、プログラムがエラーを処理するために何もしない場合、JVM はプログラムを終了して終了します。最終的に、これはメモリ割り当てによるものですが、直接ではありません。メモリ不足の状態でコードの一部が縮小され、実行が継続される可能性があります。

また、JVM 自体がメモリ不足を適切に処理できないことが時々あると指摘する人もいますが、これはかなり極端な状態です。

于 2012-11-07T13:49:35.873 に答える