java - ConcurrentHashMap 内存管理还是替代方案?

标签 java concurrenthashmap java-websocket

ConcurrentHashMap 的内存 java-websocket WebSocketClients因为值(value)观在不断增长。

我已将其与每秒尝试重新连接到对等点白名单的代码部分隔离。我已经测试过连接失败后条目是否被正确删除,事实确实如此。我还查看了我能找到的所有“concurrenthashmap 内存泄漏”。

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

我尝试实现 this suggestion

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

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

我还尝试按照此处的建议切换到 HashTable,但我立即收到 ConcurrentModificationExceptions,所以我认为这是不可能的。

当每秒快速插入和删除数千个条目时,如何管理此 ConcurrentHashMap 实现的内存?如果不行的话还有其他办法吗?


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

我添加了一个 HashMap 来存储一个新的 WebSocket,并且只有当它也不存在时才能重新尝试连接作为ConcurrentHashMap

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

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


对象

增长率再次大大降低,因为我在 上调用 close() 之前从 ConcurrentHashMapremove() WebSocketClient,然后最后从 HashMapremove()

WebSocketClient 在被关闭并从两个 map 中删除后如何仍然存在?


System.gc();

泄漏率再次大幅降低!

我在remove()之后调用它。

最佳答案

map 本身泄漏的可能性极小。如果它与 map 完全相关,可能发生的情况是,当您完成数据处理后,无法从 map 中删除数据。只要 map 指向它,它就无法被 GC 处理。

关于java - ConcurrentHashMap 内存管理还是替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21492728/

相关文章:

java - jsp,Servlet在提交页面时仅重新加载表单

java - 正在进行的快照太多。增加kafka生产者池的大小或减少并发检查点的数量

Java - 我们可以在构造函数中声明对象变量吗?

java - ConcurrentHashMap.Segment 是一个 ReentrantLock?

java - Tomcat 7 : WebSocket upgrade doesn't work

java - Jersey 应用程序 - 415 不支持的媒体类型

java - 静态 ConcurrentHashMap 副本中的值对象是否会引用与原始值对象相同的值对象?

java - ConcurrentHashMap 和 Fibonacci 数 - 不一致的结果

java - GraphQL 是否支持 websockets?

java - Websocket Apache 2.4.x Proxy Tomcat 7.x 打开事件只发生在浏览器端