2

java-websocket WebSocketClientsConcurrentHashMap作为值的内存不断增长。

我已将其隔离到尝试每秒重新连接到对等方白名单的代码部分。我已经测试过在连接失败后是否正确删除了条目,并且确实如此。我还查看了所有我能找到的“concurrenthashmap memory leak”。

我不知道如何实施这种可能的解决方案。该解决方案是否解决了问题?如果是这样,请提供示例代码。

我试图实施这个建议

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

我认为这在一定程度上减缓了增长率,但我不知道如何调整它。这通常是正确的方法吗?如果是这样,请提供示例代码。

我也尝试HashTable按照这里的建议切换到 a ,但我ConcurrentModificationExceptions立即得到了,所以我认为这已经结束了。

ConcurrentHashMap当每秒快速插入和删除数千个条目时,如何管理此实现的内存?如果不能,是否有替代方案?


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

我添加了HashMap存储 a 的 a new WebSocket,并且只有当它不存在时才能重新尝试连接以及ConcurrentHashMap.

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

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


死了Object吗?

增长率再次大大降低,因为我remove()ConcurrentHashMap之前调用close()WebSocketClient然后最后remove()HashMap.

WebSocketClient在被关闭并从两个地图中删除后,如何以及为什么仍然会徘徊?


System.gc();

泄漏率再次大大降低!

我叫它之后remove()

4

1 回答 1

2

地图本身泄漏的可能性很小。如果它与地图有关,则可能发生的情况是,当您完成地图时,您无法从地图中删除数据。只要地图指向它,它就无法获得 GC。

于 2014-02-01T01:41:40.557 回答