DelayQueue具有更高的速度remove()?

Cud*_*gon 10 java performance

我有一个项目跟踪超过500k对象的状态信息,程序接收关于这些对象的10k更新/秒,更新包括新的,更新或删除操作.

作为程序的一部分,必须在大约每五分钟对这些对象进行一次保持,为此我将它们放置在一个DelayQueue实现Delayed界面中,允许阻止DelayQueue这些对象的保持功能.

  • 在新的时候,一个物体被放置在DelayQueue.

  • 一旦更新,对象是remove()"从D DelayQueue,更新,然后重新插入它是由更新的信息,决定新的位置.

  • 删除后,该对象remove()来自DelayQueue.

我面临的问题是,remove()一旦队列传递了大约450k个对象,该方法就会变得非常长.

该程序是多线程的,一个线程处理更新,另一个线程处理内容.由于remove()延迟,我们遇到了令人讨厌的锁定性能问题,最终更新线程缓冲区消耗了所有堆空间.

我已经设法通过创建一个来解决这个问题DelayedWeakReference (extends WeakReference implements Delayed),它允许我将"阴影"对象留在队列中,直到它们正常到期为止.

这会消除性能问题,但会导致内存需求的显着增加.这样做会导致DelayedWeakReference实际需要在队列中的每个对象大约5 秒.

是否有人知道DelayQueue有额外的跟踪,允许快速remove()操作?或者有什么建议可以更好地处理这个问题,而不会消耗更多的内存?

Yai*_*sky 3


我花了一些时间来思考这个问题,
但是在阅读了您有趣的问题几分钟后,以下是我的想法:
A.如果您的对象有某种ID,用它来散列,并且实际上没有一个延迟队列,但有N个延迟队列。
这会将锁定因子减少N。
将会有一个中央数据结构,
保存这N个队列。由于N是预先配置的,因此
您可以在系统启动时创建所有N个队列。