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
之后调用它。
答案 0 :(得分:2)
地图本身不太可能泄漏。可能发生的事情,如果它与地图完全相关,那就是当你完成它时你无法从地图中删除数据。只要地图指向它就无法获得GC。