500kを超えるオブジェクトの状態情報を追跡するプロジェクトがあります。プログラムは、これらのオブジェクトについて1秒あたり10kの更新を受け取ります。更新は、新規、更新、または削除の操作で構成されます。
プログラムの一環として、これらのオブジェクトに対して約5分ごとにハウスキーピングを実行する必要があるため、この目的のために、これらのオブジェクトのハウスキーピングを制御できるように、インターフェイスのDelayQueue実装に配置しました。DelayedDelayQueue
新規の場合、オブジェクトはに配置されます
DelayQueue。更新されると、オブジェクトは
remove()からDelayQueue削除され、更新されてから、更新された情報によって指定された新しい位置に再挿入されます。削除すると、オブジェクトは
remove()から'dになりDelayQueueます。
私が直面している問題はremove()、キューが約45万個のオブジェクトを通過すると、メソッドが非常に長い操作になることです。
プログラムはマルチスレッドであり、1つのスレッドが更新を処理し、もう1つのスレッドがハウスキーピングを処理します。遅延がremove()原因で、厄介なロックパフォーマンスの問題が発生し、最終的には更新スレッドバッファがすべてのヒープスペースを消費します。
を作成することでこれを回避することDelayedWeakReference (extends WeakReference implements Delayed)ができました。これにより、「シャドウ」オブジェクトを正常に期限切れになるまでキューに残すことができます。
これにより、パフォーマンスの問題は解消されますが、メモリ要件が大幅に増加します。DelayedWeakReferenceこれを行うと、実際にキューに入れる必要のあるすべてのオブジェクトに対して約5秒になります。
高速操作DelayQueueを可能にする追加の追跡機能を知っている人はいますか?remove()または、大幅に多くのメモリを消費せずにこれを処理するためのより良い方法の提案はありますか?