我有一个项目,该项目跟踪超过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个队列。

    08-06 01:51