最大保持容量が N のキャッシュが必要です。それ以外の場合は GC の対象となる最大 N 個のオブジェクトを保持できるようにしています。ここで、アプリケーション自体が、以前にキャッシュに追加されたオブジェクトへの N+1 の強力な参照を現在保持している場合、キャッシュにも N+1 を保持する必要があります。なんで?キャッシュは、この N+1 番目のオブジェクトがそうでない場合よりも長く収集されるのを妨げないため、より大きなハッシュ テーブルをより多くのキャッシュ ヒットと交換しても問題ありません。
別の言い方をすれば、追加されたすべてのオブジェクトを強力な到達可能性を維持しながら保持し、サイズ == N を維持するのに十分な非強力な到達可能オブジェクトも保持するオブジェクト キャッシュが必要です。
例
N=100 で作成されたキャッシュがあります。サイズは 0 から始まります。150 個のオブジェクトが追加され、サイズは 150 になります。これらのオブジェクトの 100 個は、強く到達できなくなります (弱く、柔らかく、何でも)。キャッシュはそれらのうち 50 個を削除し、50 個を保持します。サイズは 100 です。さらに 49 個の強力に到達可能なオブジェクトが追加されます。サイズは 100 のままですが、そのうちの 99 個が強く到達可能であり、1 つだけが強く到達可能ではありません。何が起こったのかというと、49 の古い、強く到達できないオブジェクトが新しい 49 に置き換えられたのです。新しいオブジェクトは強く到達可能だからです。
動機
実際には、多くのユースケースで直感的に必要なことだと思います。通常、キャッシュの容量は、キャッシュ ヒット確率と引き換えに最大メモリ使用量を保証します。キャッシュが保持するオブジェクトの到達可能性を認識していれば、キャッシュは、最大メモリ使用量の保証を変更することなく、より高いキャッシュ ヒット確率を提供できます。
トラブル
JVMではできないのではないかと心配しています。私は別のことを言われることを望んでいますが、事実が不可能であることがわかっている場合は、根拠があればその答えも受け入れます.