我有一个项目可以跟踪超过 500k 个对象的状态信息,该程序每秒接收 10k 次关于这些对象的更新,更新包括新建、更新或删除操作。
作为程序的一部分,必须大约每五分钟对这些对象执行一次内务管理,为此我将它们放置在DelayQueue
实现接口中,允许控制这些对象的内务Delayed
处理的阻塞功能。DelayQueue
在 new 上,一个对象被放置在
DelayQueue
.更新后,对象
remove()
从 'd' 中DelayQueue
更新,然后重新插入到由更新信息指定的新位置。删除后,该对象
remove()
将从DelayQueue
.
我面临的问题是,remove()
一旦队列通过大约 450k 个对象,该方法就会变成一个非常长的操作。
该程序是多线程的,一个线程处理更新,另一个处理内务。由于remove()
延迟,我们遇到了令人讨厌的锁定性能问题,最终更新线程缓冲区消耗了所有堆空间。
我设法通过创建一个来解决这个问题DelayedWeakReference (extends WeakReference implements Delayed)
,它允许我将“影子”对象留在队列中,直到它们正常过期。
这消除了性能问题,但会导致内存需求显着增加。这样做会导致DelayedWeakReference
每个实际需要在队列中的对象大约 5 。
有人知道DelayQueue
允许快速remove()
操作的附加跟踪吗?或者有什么更好的方法来处理这个问题而不消耗更多的内存?