我有一個項目可以跟蹤超過500k個對象的狀態信息,程序每秒接收10k次關於這些對象的更新,更新包括新的更新或刪除操作。DelayQueue更高的速度remove()?
作爲該計劃的內部管理的一部分,必須對這些對象進行大約每隔五分鐘,爲了這個目的,我把他們安置在一個DelayQueue
實現Delayed
接口,允許DelayQueue
的攔截功能來控制的看家這些對象。
新的時候,對象被放在
DelayQueue
上。更新後,對象是中的
remove()
'd,更新並重新插入到由更新信息指示的新位置。刪除後,對象是的
remove()
'd。
我所面臨的問題是,一旦該隊列繞過450K對象remove()
方法變成過分長時間操作。
程序是多線程的,一個線程處理更新,另一個線程處理更新。由於remove()
延遲,我們得到令人討厭的鎖定性能問題,並且最終更新線程緩衝區佔用了所有堆空間。
我已經設法通過創建一個DelayedWeakReference (extends WeakReference implements Delayed)
來解決這個問題,它允許我在隊列中保留「陰影」對象,直到它們正常過期。
這消除了性能問題,但會導致內存需求的顯着增加。這樣做對於實際上需要在隊列中的每個對象都會產生大約5 DelayedWeakReference
。
有沒有人知道DelayQueue
附加追蹤,允許快速remove()
操作?或者有沒有更好的方法來處理這個問題,而不消耗更多的內存?
只是好奇...但是這究竟是什麼(除了技術問題之外)? –
它是處理防火牆狀態表內容的引擎,它從防火牆獲取文本輸出並重構內存中的狀態表。這允許您執行大量操作和分析,並且更重要的是定期導出其他格式的信息,導出NetFlow中使用的自上次更新以來的差異。 – CuddlyDragon