リスト/テーブルのエントリをバックアップするために概念的に使用されるConcurrentLinkedQueueを読み書きするマルチスレッドアプリがあります。私はもともとこれにConcurrentHashMapを使用しましたが、これはうまく機能しました。注文エントリを追跡する必要がある新しい要件があるため、条件によっては、最も古い最初の注文で削除される可能性があります。ConcurrentLinkedQueueは良い選択であるように見え、機能的にはうまく機能します。
設定可能な数のエントリがメモリに保持され、制限に達したときに新しいエントリが提供されると、キューは最も古いものから順に検索され、削除できるエントリが最初に検索されます。特定のエントリはシステムによって削除されず、クライアントとの対話を待ちます。
発生しているように見えるのは、キューの先頭に発生したエントリがあります。たとえば、10万エントリ前です。キューには構成されたエントリの数が制限されているようです(size()== 100)が、プロファイリング時に、メモリ内に最大100KのConcurrentLinkedQueue$Nodeオブジェクトがあることがわかりました。これは仕様によるもののようで、ConcurrentLinkedQueueのソースを一瞥するだけで、削除すると、保存されているオブジェクトへの参照が削除されるだけで、リンクリストは繰り返しのために残されます。
最後に私の質問:この性質のコレクションを処理するための「より良い」怠惰な方法はありますか?私はConcurrentLinkedQueueの速度が大好きです。この場合、可能と思われる無制限のリークを許容することはできません。そうでない場合は、順序を追跡するために2番目の構造を作成する必要があり、同じ問題に加えて同期の問題が発生する可能性があります。