JVM は、ガベージ コレクターが必要であるとどのくらい正確に判断しますか?JVM が GC を呼び出さないように制限する方法はありますか?
5 に答える
JVM は、ガベージ コレクターが必要であるとどの程度正確に判断しますか?
場合によります。
スループット コレクタを使用している場合、JVM は、割り当てが必要な領域 (または領域の 1 つ) に新しいオブジェクトを割り当てることができない場合に GC を実行します。
低休止コレクタを使用している場合、空き領域の比率が構成可能なレベルを下回ると、JVM は GC をトリガーします。
JVM が GC を呼び出さないように制限する方法はありますか?
いいえ。JVM が GC を実行する必要があると判断した場合は、GC を実行します。できる唯一のことは、JVM にアプリケーション コードの呼び出しを無視するように指示することですSystem.gc()
。
GC を呼び出さないように JVM に指示することはできませんが、 への呼び出しを無視するように JVM に指示することはできSystem.gc()
ます-XX:+DisableExplicitGC
。
通常、JVM は、ヒープ領域の 1 つがいっぱいに近づくと、ガベージ コレクション サイクルの実行を決定します。最終的には、決定は JVM 次第であることに注意してください。
しばらくの間 GC を実行しないように JVM に指示することに関しては、(ヒープ割り当てを完全に回避する以外に) これを行うための信頼できる移植可能な方法はありません。
GC の一時停止を最小限に抑えようとしている場合は、Java Performance book に適切な資料があります。
これは、仮想マシンの実装に大きく依存します。
別の手で:
ガベージ コレクションの明示的な要求は、パフォーマンスの問題の可能性を示す指標です。
System.gc()
、Runtime.getRuntime().gc()
、およびへの呼び出しSystem.runFinalization()
はお勧めしません。オプションを使用してガベージ コレクションを無効にするかどうかに関係なく、コードは同じ動作をする必要があります-Xdisableexplicitgc
。さらに、「最新の」jvm は、ガベージ コレクションを非常にうまく処理します。アプリケーション内でメモリ リークとは関係のないメモリ使用量の問題が発生した場合は、コード自体ではなく、JVM オプションで対処する必要があります。
一般的に言えば、GC は必要な場合にのみ実行されます。例外として、同時マーク スイープは、アプリケーションを停止する必要がないように時期尚早に開始されます。
私見、最も簡単で最善の解決策は、それほど多くのゴミを作成しないことです。メモリ プロファイラーを使用して、生成するガベージの量を減らすことができます。これにより、コレクションのサイズと発生頻度が減少します。極端な場合、1 日または 1 週間にわたって収集を避けることもできます。
ガベージを減らすことの利点は、ガベージで CPU キャッシュをフラッシュすることを減らすことです。L3 キャッシュはわずか数 MB であり、数 MB のガベージを作成すると、有用な情報が効果的に押し出され、アプリケーションの速度が低下します。