gpt4 book ai didi

java - 具有更高速度的DelayQueue remove()?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:01:17 24 4
gpt4 key购买 nike

我有一个跟踪超过 500k 个对象的状态信息的项目,该程序每秒接收 10k 个关于这些对象的更新,更新包括新建、更新或删除操作。

作为程序内部管理的一部分,必须大约每五分钟对这些对象执行一次,为此我将它们放置在实现 Delayed 接口(interface)的 DelayQueue 中,允许 DelayQueue 的阻塞功能来控制这些对象的管理。

  • 在 new 时,一个对象被放置在 DelayQueue 上。

  • 更新后,对象从 DelayQueueremove(),更新并重新插入到更新信息指定的新位置。

  • 删除后,对象从DelayQueueremove()

我面临的问题是,一旦队列传递了大约 450k 个对象,remove() 方法就会变成一个过长的操作。

该程序是多线程的,一个线程处理更新,另一个线程处理内部事务。由于 remove() 延迟,我们遇到了严重的锁定性能问题,最终更新线程缓冲区消耗了所有堆空间。

我设法通过创建一个 DelayedWeakReference(扩展 WeakReference 实现延迟) 来解决这个问题,它允许我将“影子”对象留在队列中,直到它们正常过期。

这消除了性能问题,但会导致内存需求显着增加。这样做会为每个实际需要在队列中的对象生成大约 5 个 DelayedWeakReference

是否有人知道 DelayQueue 具有允许快速 remove() 操作的额外跟踪?或者有任何更好的方法来处理这个问题而不消耗更多内存的建议吗?

最佳答案


我花了一些时间思考这个问题,
但在阅读了几分钟有趣的问题后,这是我的想法:
A.如果你对象有某种ID,用它来散列,实际上没有一个延迟队列,但是有N个延迟队列。
这将减少 N 的锁定因子。
会有一个中央数据结构,
持有这N个队列。由于 N 是预先配置的,
您可以在系统启动时创建所有 N 个队列。

关于java - 具有更高速度的DelayQueue remove()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13420915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com