我有一个跟踪500,000个对象状态信息的项目,该程序每秒接收10,000次有关这些对象的新建、更新或删除操作。
作为程序的一部分,这些对象需要大约每五分钟执行一次清理工作,为此,我将它们放在了一个实现Delayed
接口的DelayQueue
中,利用DelayQueue
的阻塞功能来控制这些对象的清理工作。
在新建时,对象会被放置在
DelayQueue
中。在更新时,将从
DelayQueue
中删除对象,对其进行更新并以更新的信息为准重新插入到新位置中。在删除时,将从
DelayQueue
中删除对象。
我面临的问题是,一旦队列中的对象超过约450,000个,remove()
方法就会变得非常耗时。
程序是多线程的,一个线程负责处理更新,另一个线程负责清理工作。由于remove()
延迟,我们遇到了一些令人讨厌的锁定性能问题,并且最终更新线程缓冲区消耗了所有堆空间。
我通过创建一个DelayedWeakReference (扩展弱引用并实现Delayed)
来解决这个问题,它允许我在队列中留下“影子”对象,直到它们按照正常方式过期。
这可以解决性能问题,但会显著增加内存需求。这样做会导致每个实际需要放入队列中的对象约有5个DelayedWeakReference
。
是否有人知道带有额外跟踪功能且允许快速执行remove()
操作的DelayQueue
?或者有没有更好的方法来处理这个问题而不会消耗太多内存?