Javaでのメモリ(特にガベージコレクション)がどのように機能するかについての仮定には欠陥があります。
Runtime.getRuntime().freeMemory()
。
この呼び出しは、JVMヒープ上の「空き」メモリのみを示します。これは、およびコマンドライン引数でに割り当てられます。または、アプリサーバーを使用している場合は、いくつかの起動スクリプトで。-Xms
-Xmx
java
なぜあなたがやろうとしているのは時間の無駄です
なぜこの質問に対するこの答えを見てください!
Javaのガベージコレクター(空きメモリを制御する)は、可能な限り多くのメモリを解放するように調整されていません。パフォーマンスと応答性のバランスが取れるように調整されています。それはオンデマンドでメモリを解放するだけであり、最大の空きメモリを持つことに利点はなく、そうしようとすることには多くの欠点があります。
これにより、参照されなくなったオブジェクトは、それらが占有するメモリが実際に必要になるまで、「メモリの使用」を回避します。これらを時期尚早に削除すると、実行中のコードのパフォーマンスが低下するため、これは実際には最適です。
メモリを解放する必要がある場合にのみ、それらを非常に迅速に削除することが、ガベージコレクターの目標であり、可能な限り多くのメモリを解放しようとはしません。
正しく実装されたJavaプログラムを呼び出す必要はありません。System.gc()
Java HotSpotには、3つの異なるコレクターが含まれています。シリアルコレクションはGCにシングルスレッドを使用し、データセットが100Mバイト未満のシングルプロセッサマシンに最適です。Parallelは、マイナーコレクションを並行して実行します。マルチスレッドまたはマルチプロセッサハードウェアで実行される中規模から大規模のデータセットに最適です。コンカレントコレクターは、スループットよりも応答時間が重要な場合にガベージコレクションの一時停止が短くなるように最適化されています。このモードは通常、シングルコアマシンでは何のメリットもありません。
OutOfMemoryExceptionsを回避するには
サーバーで可能な限り大きな設定-Xmx
に設定します。-Xms
公称と思われるメモリブロックの最小サイズに設定します。小さすぎると大きすぎるよりも悪いです。
参照を漏らさないでください。