2

疑問があります。JVM に次の 2 つのパラメーターを渡したとします。 -Xms256mb -Xmx1024mb プログラムの開始時に 256MB が割り当てられます。次に、いくつかのオブジェクトが作成され、JVM プロセスはより多くのメモリを割り当てようとします。JVM が 800MB を割り当てる必要があるとします。Xmx 属性はそれを許可しますが、システム (Linux/Windows としましょう) で現在利用可能なメモリは 600MB です。OutOfMemoryError がスローされる可能性はありますか? それとも、スワップメカニズムが役割を果たすのでしょうか?

2 番目の質問は、GC アルゴリズムの品質に関するものです。jdk1.5u7 と jdk1.5u22 があるとしましょう。後者の JVM でメモリ リークがなくなり、OutOfMemoryError が発生しない可能性はありますか? 最新版でGCの品質が向上する可能性はありますか?

4

4 に答える 4

2

メモリ リークはアプリケーションのアーティファクトであるため、GC の品質 (バグのある GC を除く) はメモリ リークに影響しません。GC は実際のゴミではないものを収集できません。

JVM がより多くのメモリを必要とする場合、システムから取得します。システムがスワップできる場合は、(他のプロセスと同様に) スワップします。システムがスワップできない場合、JVM は OOM 例外ではなくシステム エラーで失敗します。これは、システムが要求を満たすことができず、この点が事実上致命的であるためです。

原則として、アクティブな JVM を部分的にスワップ アウトする必要はありません。GC イベントは、システムが仮想メモリ システムを介してページを循環させるときに、あなたを押しつぶします。アイドル状態のバックグラウンド JVM を全体としてスワップ アウトするのは 1 つのことですが、1G の RAM としてマシンを作成し、メイン プロセスが 1.5GB を必要とする場合、大きな問題が発生します。

JVM のような呼吸する余地があります。メモリ リークがなくても、十分なメモリがない場合、JVM が GC デス スパイラルに陥るのを見てきました。彼らは単に十分なワーキングセットを持っていませんでした。ヒープの別のチャンクを追加すると、その JVM はひどいものから幸せなノコギリ GC グラフに変わりました。

JVM に必要なメモリを与えると、JVM はより快適になります。

于 2012-08-10T17:29:21.983 に答える
2

「メモリ」と「RAM」は同じものではありません。メモリには仮想メモリ (スワップ) が含まれているため、OutOfMemoryError を取得する前に、空き RAM + 空きスワップの合計を割り当てることができます。

于 2012-08-10T17:29:47.790 に答える
0

割り当ては、使用する OS によって異なります。あまりにも多くのメモリを割り当てると、一部をスワップにロードすることになり、遅くなる可能性があります。プログラムの実行速度が遅くなるかどうかは、VM がメモリを処理する方法によって異なります。

VM の速度低下を防ぐためにすべてのメモリを占有しないようにするために、それほど大きくないヒープを指定しません。

于 2012-08-10T17:27:17.973 に答える
-1

最初の質問について:
実際、マシンが1024最大ヒープ サイズとして要求した MB を割り当てることができない場合、JVM を起動することさえできません。
私がこれを知っているのは、大きなヒープ サイズで Eclipse を開こうとすることが多く、JVM がロードできなかった大きなヒープ スペースを OS が割り当てることができないことに気付いたからです。自分で試して確認することもできます。したがって、残りの詳細はあなたには関係ありません。もちろん、プログラムが (すべての言語と同じように) スワップを多用すると、パフォーマンスはひどいものになります。

2番目の質問について:

メモリリークが消える

それらは修正する必要があるバグであるため不可能です

OutOfMemoryError は発生しませんか?最新版でGCの品質が向上する可能性はありますか?

これは、たとえば、GC でいくつかの異なるアルゴリズムが使用されていて、例外が表示される前に開始された場合に発生する可能性があります。ただし、メモリ リークが発生した場合は、それがマスクされるか、断続的に発生する可能性があります。
また、さまざまな JVM には、構成可能なさまざまな GC があります。

更新:
Windows での最大ヒープの動作に気付いたことを認めなければなりません (@Orochi のメモを参照)。これが Linux にも当てはまるとは断言できません。しかし、あなたはそれを自分で試すことができます。

更新 2: IBM から @DennisCheung のコメントへの回答として(私の強調):

この表は、可能な最大 Java ヒープと、最大 Java ヒープ サイズ設定の推奨制限の両方を示しています。ページングやスワッピング。ページングは​​システムのパフォーマンスを低下させ、Java メモリ管理システムのパフォーマンスに影響を与えます。

于 2012-08-10T17:16:47.857 に答える