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