我有一个项目可以跟踪超过500k个对象的状态信息,程序每秒接收10k次关于这些对象的更新,更新包括新的更新或删除操作。DelayQueue更高的速度remove()?
作为该计划的内部管理的一部分,必须对这些对象进行大约每隔五分钟,为了这个目的,我把他们安置在一个DelayQueue
实现Delayed
接口,允许DelayQueue
的拦截功能来控制的看家这些对象。
新的时候,对象被放在
DelayQueue
上。更新后,对象是中的
remove()
'd,更新并重新插入到由更新信息指示的新位置。删除后,对象是的
remove()
'd。
我所面临的问题是,一旦该队列绕过450K对象remove()
方法变成过分长时间操作。
程序是多线程的,一个线程处理更新,另一个线程处理更新。由于remove()
延迟,我们得到令人讨厌的锁定性能问题,并且最终更新线程缓冲区占用了所有堆空间。
我已经设法通过创建一个DelayedWeakReference (extends WeakReference implements Delayed)
来解决这个问题,它允许我在队列中保留“阴影”对象,直到它们正常过期。
这消除了性能问题,但会导致内存需求的显着增加。这样做对于实际上需要在队列中的每个对象都会产生大约5 DelayedWeakReference
。
有没有人知道DelayQueue
附加追踪,允许快速remove()
操作?或者有没有更好的方法来处理这个问题,而不消耗更多的内存?
只是好奇...但是这究竟是什么(除了技术问题之外)? –
它是处理防火墙状态表内容的引擎,它从防火墙获取文本输出并重构内存中的状态表。这允许您执行大量操作和分析,并且更重要的是定期导出其他格式的信息,导出NetFlow中使用的自上次更新以来的差异。 – CuddlyDragon