0

オペレーティング システムは、10 台の仮想マシン JVM を実行しています。実際、ほとんどの人は何もせず、時々ただ仕事をしているだけです。各プロセスは、600MB のシステム メモリを割り当てます。実質100MBまで物理的に使用できることがわかっています。これらの各プロセスの残りの 500 MB は、JVM (OldGen など) によって管理されるメモリです。残念ながら、私のシステムには 2GB の RAM しかないため、割り当てられたメモリのほとんどがスワップに取り込まれてしまいます。これは、マシンの 1 つ (最初のマシン) の時間になると、スワップが数十秒間システム メモリに読み込まれることを意味します。

タスクの完了後に JVM がメモリをオペレーティング システムに解放するように強制する方法はありますか? たとえば、GC は 1 ~ 5 分ごとに実行され、その結果、プロセス メモリがシステムに対して解放されます。

使用しています: Linux x86_64 SMP、Java HotSpot (TM) 64-Bit Server VM 1.6.0

4

2 に答える 2

0

私はパフォーマンスの問題の専門家ではありませんが、これについてお手伝いさせていただきます。

System.gc()であるガベージコレクションシステムへの呼び出しがあります。クラスSystemの公式ドキュメント(http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/System.html)を参照すると、このメソッドがガベージコレクションを実行することがわかります。 。

それでも、インターネットを調べると(System.gc()が何かを行う場合など)、この呼び出しがガベージコレクションシステムを呼び出す可能性があることがわかります。私の個人的な経験はその投稿に同意します。

メモリ管理が自動化されているため、ガベージコレクションシステムは、メモリを適切に管理するために非常に長い時間を費やします。管理アルゴリズムは非常に効率的であり、それらを上手く利用しようとしても、通常、優れた結果は得られません。

ほとんどのマシンは何もしないとおっしゃいましたが、仕事があるときにそれらを「殺して」新しいマシンを始めてみませんか?それはもっと効率的ではないでしょうか?

于 2012-04-26T13:49:44.427 に答える
0

これは、マシンの 1 つ (最初のマシン) でスワップが数十秒間システム メモリに読み込まれることを意味します。

メモリ ページは、アクセスされたときにのみスワップインされます。あなたが話している500MBがJVMの観点から本当に「空いている」場合、それらは最終的にスワップインされません.JVMがそのメモリに触れているのには理由があるに違いありません。1 つの可能性は、実際には無料ではなく、ライブ オブジェクトが含まれていることです。

私がお勧めします:

  1. メモリ プロファイラー (YourKit または VisualVM) を使用して、JVM の実際のメモリ使用量を確認します。
  2. でヒープのサイズを調整する可能性があります-Xmx
于 2012-04-26T13:44:14.100 に答える