7

JVM は、ガベージ コレクターが必要であるとどのくらい正確に判断しますか?JVM が GC を呼び出さないように制限する方法はありますか?

4

5 に答える 5

5

JVM は、ガベージ コレクターが必要であるとどの程度正確に判断しますか?

場合によります。

  • スループット コレクタを使用している場合、JVM は、割り当てが必要な領域 (または領域の 1 つ) に新しいオブジェクトを割り当てることができない場合に GC を実行します。

  • 低休止コレクタを使用している場合、空き領域の比率が構成可能なレベルを下回ると、JVM は GC をトリガーします。

JVM が GC を呼び出さないように制限する方法はありますか?

いいえ。JVM が GC を実行する必要があると判断した場合は、GC を実行します。できる唯一のことは、JVM にアプリケーション コードの呼び出しを無視するように指示することですSystem.gc()

于 2013-03-27T07:28:52.600 に答える
4

GC を呼び出さないように JVM に指示することはできませんが、 への呼び出しを無視するように JVM に指示することはできSystem.gc()ます-XX:+DisableExplicitGC

于 2013-03-27T07:24:46.483 に答える
3

通常、JVM は、ヒープ領域の 1 つがいっぱいに近づくと、ガベージ コレクション サイクルの実行を決定します。最終的には、決定は JVM 次第であることに注意してください。

しばらくの間 GC を実行しないように JVM に指示することに関しては、(ヒープ割り当てを完全に回避する以外に) これを行うための信頼できる移植可能な方法はありません。

GC の一時停止を最小限に抑えようとしている場合は、Java Performance book に適切な資料があります。

于 2013-03-27T07:24:54.493 に答える
1

これは、仮想マシンの実装に大きく依存します。

別の手で:

ガベージ コレクションの明示的な要求は、パフォーマンスの問題の可能性を示す指標です。

コードの正確性: System.gc() の呼び出し

System.gc()Runtime.getRuntime().gc()、およびへの呼び出しSystem.runFinalization()はお勧めしません。オプションを使用してガベージ コレクションを無効にするかどうかに関係なく、コードは同じ動作をする必要があります-Xdisableexplicitgc。さらに、「最新の」jvm は、ガベージ コレクションを非常にうまく処理します。アプリケーション内でメモリ リークとは関係のないメモリ使用量の問題が発生した場合は、コード自体ではなく、JVM オプションで対処する必要があります。

PMD ルール DoNotCallGarbageCollectionExplicitly

于 2013-03-27T07:35:35.363 に答える
0

一般的に言えば、GC は必要な場合にのみ実行されます。例外として、同時マーク スイープは、アプリケーションを停止する必要がないように時期尚早に開始されます。

私見、最も簡単で最善の解決策は、それほど多くのゴミを作成しないことです。メモリ プロファイラーを使用して、生成するガベージの量を減らすことができます。これにより、コレクションのサイズと発生頻度が減少します。極端な場合、1 日または 1 週間にわたって収集を避けることもできます。

ガベージを減らすことの利点は、ガベージで CPU キャッシュをフラッシュすることを減らすことです。L3 キャッシュはわずか数 MB であり、数 MB のガベージを作成すると、有用な情報が効果的に押し出され、アプリケーションの速度が低下します。

于 2013-03-27T07:49:34.403 に答える