ConcurrentHashMap内存管理还是另类?

时间:2014-02-01 00:51:43

标签: java concurrenthashmap java-websocket

ConcurrentHashMap java-websocket WebSocketClients作为值的记忆正在不断增长。

我已将它隔离到试图每秒重新连接到同级白名单的代码部分。我已经测试过,看看连接失败后是否正确删除了条目,它们是。我还查看了“concurrenthashmap memory leak”所能找到的所有内容。

我不知道如何实施this possible solution。这个解决方案能解决问题吗?如果是,请提供示例代码。

我尝试实施this suggestion

ConcurrentHashMap<String, MyClass> m =
  new ConcurrentHashMap<String, MyClass>(8, 0.9f, 1);

我认为这有点放慢了增长速度,但我不知道如何调整它。这通常是正确的方法吗?如果是,请提供示例代码。

我也尝试按照此处的建议切换到HashTable,但我立刻得到ConcurrentModificationExceptions,所以我认为这样做了。

如果每秒快速插入和删除数千个条目,如何管理此ConcurrentHashMap实现的内存?如果不能,还有其他选择吗?


通过引用而不是通过副本传递

我添加了一个存储HashMap new的{​​{1}},只有在WebSocket不存在的情况下才能重新尝试连接。< / p>

这极大地改善了内存管理,但它仍然有点泄漏,大约每0.1秒0.1 MB,每秒约5次尝试。

这是我的代码问题,ConcurrentHashMap的“析构函数”,还是WebSocket对已删除值的管理?


ConcurrentHashMap s?

由于我Object的{​​{1}}在remove()上调用ConcurrentHashMap之后再从close()开始WebSocketClient,因此增长率再次大幅降低remove()

&amp;为什么HashMap在关闭并从两个地图中移除后仍然会停留?


的System.gc();

泄漏率再次大大降低!

我在WebSocketClient之后调用它。

1 个答案:

答案 0 :(得分:2)

地图本身不太可能泄漏。可能发生的事情,如果它与地图完全相关,那就是当你完成它时你无法从地图中删除数据。只要地图指向它就无法获得GC。