我有一个项目跟踪超过500k对象的状态信息,程序接收关于这些对象的10k更新/秒,更新包括新的,更新或删除操作.
作为程序的一部分,必须在大约每五分钟对这些对象进行一次保持,为此我将它们放置在一个DelayQueue
实现Delayed
界面中,允许阻止DelayQueue
这些对象的保持功能.
在新的时候,一个物体被放置在DelayQueue
.
一旦更新,对象是remove()
"从D DelayQueue
,更新,然后重新插入它是由更新的信息,决定新的位置.
删除后,该对象remove()
来自DelayQueue
.
我面临的问题是,remove()
一旦队列传递了大约450k个对象,该方法就会变得非常长.
该程序是多线程的,一个线程处理更新,另一个线程处理内容.由于remove()
延迟,我们遇到了令人讨厌的锁定性能问题,最终更新线程缓冲区消耗了所有堆空间.
我已经设法通过创建一个来解决这个问题DelayedWeakReference (extends WeakReference implements Delayed)
,它允许我将"阴影"对象留在队列中,直到它们正常到期为止.
这会消除性能问题,但会导致内存需求的显着增加.这样做会导致DelayedWeakReference
实际需要在队列中的每个对象大约5 秒.
是否有人知道DelayQueue
有额外的跟踪,允许快速remove()
操作?或者有什么建议可以更好地处理这个问题,而不会消耗更多的内存?
我花了一些时间来思考这个问题,
但是在阅读了您有趣的问题几分钟后,以下是我的想法:
A.如果您的对象有某种ID,用它来散列,并且实际上没有一个延迟队列,但有N个延迟队列。
这会将锁定因子减少N。
将会有一个中央数据结构,
保存这N个队列。由于N是预先配置的,因此
您可以在系统启动时创建所有N个队列。