2

私は時々重い仕事をするJavaアプリケーションを開発しています。
この場合、通常よりも多くの RAM を使用するため、アプリの割り当てメモリ スペースが増加します。

私の質問は、作業が終了しても割り当てられたスペースが減らないのはなぜですか?
プロファイラーを使用すると、たとえば 70 MB が割り当てられているのに、5 MB しか使用されていないことがわかります。割り当てられたスペースは拡大することしかできず、縮小することはできないようです。

ありがとう

4

3 に答える 3

2

通常、JVM は、割り当てたメモリの解放に関して非常に制限的です。ただし、より積極的に解放するように構成できます。プログラムの起動時に、これらの設定を JVM に送信してみてください。

-XX:GCTimeRatio=5

-XX:AdaptiveSizeDecrementScaleFactor=1
于 2012-08-13T19:36:26.050 に答える
1

JVM は、メモリをいつオペレーティング システムに解放するかを決定します。Windows XP での私の経験では、これはほとんど起こりません。コマンド プロンプト (または Swing ウィンドウ) を最小化すると、メモリが解放されたように見えることがあります。Linux 上の JVM は、メモリを返すのに優れていると思います。

于 2012-08-12T17:08:40.867 に答える
0

一般的に、2 つの理由が考えられます。

おそらく、プログラムにメモリ管理の問題があります。たとえば、いくつかのオブジェクトをコレクションに保存し、これらのオブジェクトをコレクションから削除しない場合、ガベージ コレクションは行われません。このような場合は、見つけて修正する必要があるバグがあります。

しかし、おそらくあなたのコードは問題ありませんが、GC はまだ使用されていないオブジェクトを削除しません。この理由は、GC が独自のライブを実行し、独自の決定を下すためです。たとえば、十分なメモリがあると判断した場合、メモリ使用量があるしきい値に達するまで、使用済みオブジェクトを削除しません。

ここで発生しているケースを認識するためにSystem.gc()、プログラムまたはプロファイラーを使用して呼び出してみてください (通常、プロファイラーには GC を実行するボタンがあります)。GC にコードを強制的に実行させた後、使用されたオブジェクトが削除された場合は問題ありません。それ以外の場合は、バグを見つけようとします。すでに使用しているプロファイラーが役に立ちます。

于 2012-08-12T11:44:32.610 に答える