2

メモリがいっぱいになる前にキャッシュを空にする信頼できる方法はありますか? または、現在利用可能な「実際の」空きメモリ (ハード参照されたオブジェクト) に従ってキャッシュを制限することをお勧めします。

GC ペナルティが高いため、ソフト参照キャッシュはお勧めできません。一度制限に達すると、すべてのキャッシュ エントリをリロードする必要があります。

また、値runtime.freeMemory()が低すぎても、次の GC サイクルの後に十分な空き領域がある可能性があるため、実際に使用されているメモリの適切な指標ではないため、値は私の目的にはそれほど信頼できません。

各プリミティブ時間が消費するメモリ量を把握しようとしたため、キャッシュの実際のメモリ使用量を把握してそれに制限をかけましたが、保存に使用されるメモリ量を把握する信頼できる方法を見つけることができませんでしたサイズ n の文字列参照。

4

3 に答える 3

2

最近の Oracle 1.7 化身の 1 つを試してください。GarbageCollectorMXBean と GarbageCollectionNotificationInfo を提供する必要があります。これを使用して、各 GC サイクル後に使用済み/未使用のメモリ量を監視します。ここにサンプルコードがあります。次に、Peter が提案するようにマルチレベル キャッシュを使用して、メモリが不足しているときに外側のレベルを一掃しますが、より小さな第 1 レベルのキャッシュを保持できます。

于 2013-01-07T17:37:00.507 に答える
2

2 つまたは 3 つのコレクションを持っています。メモリの可用性でサービスを低下させたい場合は、使用できます。

  • LinkedHashMap など、最新のエントリのマップ。
  • ソフト参照のマップ。
  • 弱参照のマップ。

弱い参照はマイナー コレクションの後にクリアでき、必要に応じてソフト参照はクリアされ、強参照マップには常に保持されるコア データがあることを知っていれば、各マップのサイズを制御できます。

ところで: 頻繁にメモリ制限に達している場合は、JVM ごとに最大約 32 GB の追加メモリを購入することを検討する必要があります。200 ドル未満で 32 GB を購入できます。

于 2013-01-07T10:00:33.460 に答える
1

最も簡単な解決策は、参照を弱参照に変更することです。このようにして、すべての強力な参照がスコープ外になった場合でも、参照をファイナライズしてガベージコレクションを行うことができます。

参照:http ://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ref/WeakReference.html

于 2013-01-07T10:05:04.847 に答える