私は時々重い仕事をするJavaアプリケーションを開発しています。
この場合、通常よりも多くの RAM を使用するため、アプリの割り当てメモリ スペースが増加します。
私の質問は、作業が終了しても割り当てられたスペースが減らないのはなぜですか?
プロファイラーを使用すると、たとえば 70 MB が割り当てられているのに、5 MB しか使用されていないことがわかります。割り当てられたスペースは拡大することしかできず、縮小することはできないようです。
ありがとう
通常、JVM は、割り当てたメモリの解放に関して非常に制限的です。ただし、より積極的に解放するように構成できます。プログラムの起動時に、これらの設定を JVM に送信してみてください。
-XX:GCTimeRatio=5
-XX:AdaptiveSizeDecrementScaleFactor=1
JVM は、メモリをいつオペレーティング システムに解放するかを決定します。Windows XP での私の経験では、これはほとんど起こりません。コマンド プロンプト (または Swing ウィンドウ) を最小化すると、メモリが解放されたように見えることがあります。Linux 上の JVM は、メモリを返すのに優れていると思います。
一般的に、2 つの理由が考えられます。
おそらく、プログラムにメモリ管理の問題があります。たとえば、いくつかのオブジェクトをコレクションに保存し、これらのオブジェクトをコレクションから削除しない場合、ガベージ コレクションは行われません。このような場合は、見つけて修正する必要があるバグがあります。
しかし、おそらくあなたのコードは問題ありませんが、GC はまだ使用されていないオブジェクトを削除しません。この理由は、GC が独自のライブを実行し、独自の決定を下すためです。たとえば、十分なメモリがあると判断した場合、メモリ使用量があるしきい値に達するまで、使用済みオブジェクトを削除しません。
ここで発生しているケースを認識するためにSystem.gc()
、プログラムまたはプロファイラーを使用して呼び出してみてください (通常、プロファイラーには GC を実行するボタンがあります)。GC にコードを強制的に実行させた後、使用されたオブジェクトが削除された場合は問題ありません。それ以外の場合は、バグを見つけようとします。すでに使用しているプロファイラーが役に立ちます。