マップの現在の排除アルゴリズムは非常に怠惰です。期限切れのオブジェクトは、データ構造にアクセスした場合にのみ削除されるようです。
たとえば、アドレスからインデクサーへのマップは次のように定義されます。
ConcurrentMap<Address, Indexer> indexers = new MapMaker()
.expireAfterAccess( EXPIRATION, TimeUnit.SECONDS)
.evictionListener( new IndexEvicted())
.makeMap();
非常に驚くべきパターンにつながりcontainsKey()
ます。指定されたアドレスに対してfalseが返されますが、そのアドレスのインデクサーが削除された直後です。
クリーンアッププロセスをよりリアルタイムにするために推奨されるアプローチは何でしょうか?つまり、実際の有効期限に近いオブジェクトを削除します。
更新:リアルタイムとはどういう意味かをもっと明確にしたいと思います。上記の例では、EXPIRATIONが10秒であるため、最後にアクセスしてから10秒後に挿入されたオブジェクトが削除されることを確認したいと思います。それは今は起こっていません-マップは、立ち退きを開始するために何らかの方法で使用する必要があります。マップが完全に使用されていない場合、オブジェクトは何年もそこにとどまることができます。