ConcurrentLinkedQueue$Node 在 remove() 后仍保留在堆中
我有一个多线程应用程序编写和读取并发链接队列,它在概念上用于支持列表/表中的条目。我最初使用 ConcurrentHashMap 来实现这一点,效果很好。一项新要求要求跟踪传入的订单条目,因此可以根据某些条件以最旧的第一个顺序删除它们。ConcurrentLinkedQueue似乎是一个不错的选择,从功能上讲,它运行良好。
可配置的条目数量保存在内存中,当达到限制时提供新条目时,将按最旧的优先顺序在队列中搜索可以删除的条目。某些条目不会被系统删除并等待客户端交互。
似乎正在发生的事情是,我在队列的前面有一个条目,比如100K之前。队列似乎具有有限数量的已配置条目(size() == 100),但在分析时,我发现内存中有大约 100K ConcurrentLinkedQueue$Node 对象。这似乎是设计使然,只是浏览了 ConcurrentLinkedQueue 的源代码,删除只是删除了对所存储对象的引用,但保留了链接列表以供迭代。
最后,我的问题是:有没有一种“更好”的懒惰方法来处理这种性质的集合?我喜欢 ConcurrentLinkedQueue 的速度,我只是负担不起在这种情况下似乎可能的无限泄漏。如果没有,似乎我必须创建第二个结构来跟踪顺序,并且可能具有相同的问题,以及同步问题。