我有一个项目,该项目跟踪超过50万个对象中的状态信息,程序每秒接收有关这些对象的10k次更新,这些更新包括新的,更新或删除操作。
作为程序的一部分,必须大约每五分钟对这些对象执行一次内部整理,为此,我将它们放置在实现DelayQueue
接口(interface)的Delayed
中,从而允许DelayQueue
的阻塞功能来控制这些对象的内部整理。
DelayQueue
上。 remove()
转换为DelayQueue
,进行更新,然后将其重新插入到由更新信息决定的新位置。 remove()
中将对象添加为DelayQueue
。 我面临的问题是,一旦队列传递了大约450k个对象,
remove()
方法就会变得过长。该程序是多线程的,一个线程负责处理更新,另一个负责内部事务。由于
remove()
的延迟,我们遇到了讨厌的锁定性能问题,最终更新线程缓冲区消耗了所有堆空间。我设法通过创建一个
DelayedWeakReference (extends WeakReference implements Delayed)
来解决此问题,它使我可以将“阴影”对象留在队列中,直到它们正常过期为止。这消除了性能问题,但导致内存需求显着增加。这样做实际上为每个需要在队列中的对象产生了大约5
DelayedWeakReference
。是否有人知道带有附加跟踪的
DelayQueue
,可以快速进行remove()
操作?还是有任何建议提出更好的方法来解决此问题而不消耗大量内存? 最佳答案
花了我一些时间思考
但是在阅读了您有趣的问题几分钟后,以下是我的想法:
答:如果您的对象具有某种ID,请使用它进行哈希处理,实际上没有一个延迟队列,但有N个延迟队列。
这将使锁定因子减少N。
将有一个中央数据结构,
持有这N个队列。由于N已预先配置,
您可以在系统启动时创建所有N个队列。