Java ConcurrentHashMap内存管理还是替代方案?
as值的Java ConcurrentHashMap内存管理还是替代方案?,java,concurrenthashmap,java-websocket,Java,Concurrenthashmap,Java Websocket,as值的ConcurrentHashMap内存不断增长 我已将其隔离到代码部分,该部分尝试每秒重新连接到一个对等白名单。我已经测试了连接失败后条目是否被正确删除,它们确实被删除了。我还查看了所有我能找到的关于“concurrenthashmap内存泄漏”的信息 我不知道如何实施。这个解决方案解决问题了吗?如果是,请提供示例代码 我试图实现 ConcurrentHashMap m= 新的ConcurrentHashMap(8,0.9f,1); 我认为这在一定程度上减缓了增长速度,但我不知道如何调
ConcurrentHashMap
内存不断增长
我已将其隔离到代码部分,该部分尝试每秒重新连接到一个对等白名单。我已经测试了连接失败后条目是否被正确删除,它们确实被删除了。我还查看了所有我能找到的关于“concurrenthashmap内存泄漏”的信息
我不知道如何实施。这个解决方案解决问题了吗?如果是,请提供示例代码
我试图实现
ConcurrentHashMap m=
新的ConcurrentHashMap(8,0.9f,1);
我认为这在一定程度上减缓了增长速度,但我不知道如何调整它。这通常是正确的方法吗?如果是,请提供示例代码
我还尝试按照这里的建议切换到哈希表
,但我立即得到ConcurrentModificationExceptions
,因此我认为这是错误的
当每秒快速插入和删除数千个条目时,如何管理此ConcurrentHashMap
实现的内存?如果不能,还有其他选择吗
通过引用而不是复制传递 我添加了一个
HashMap
,它存储了一个新的WebSocket
,并且只有当连接与ConcurrentHashMap
不存在时,才能重新尝试连接
这大大改进了内存管理,但仍有少量泄漏,大约每5秒泄漏0.1 MB,每秒约5次尝试
这是我的代码、WebSocket
的“析构函数”还是ConcurrentHashMap
对删除值的管理有问题吗
死对象
s?
增长率再次大大降低,因为在调用WebSocketClient
上的close()
之前,我先从ConcurrentHashMap
中删除()
,然后从HashMap
中删除()
一个WebSocketClient
在关闭并从两个地图中删除后,如何以及为什么仍然存在
System.gc()强>
泄漏率又大大降低了
我在remove()
之后调用它。映射本身泄漏的可能性很小。如果它与地图相关,那么可能发生的情况是,在使用完地图后,您无法从地图中删除数据。只要映射指向它,它就无法获得GC。几个问题:1)您使用的是哪种VJM运行时?2.)如何测试对象的大小?3.)ConcurrentHashMap是否引用了任何“死”对象?使用堆分析工具为堆分析工具找出这一点。这或许可以帮助你确定在哪里the@Tinman非常感谢你,铁皮人!1) 无论是最新的还是最新的Java SDK,都可以直接从Oracle获得linux上的JRE。2) CHM.size()
始终报告0
。3) 我怎么会知道呢?(I=noob)。我一定会研究堆分析!再次非常非常感谢,提前非常感谢!好的,当我问你们如何测试大小时,我指的是那个物体在内存中的大小。“已删除”的套接字连接将保留在堆中,直到垃圾收集器(GC)将其删除。GC只会时不时地这样做。@Tinman再次非常感谢Tinman!我还是不知道怎么做。我用的是VisualVM,但我不知道到底要找什么。堆转储中有大量的char[]
s和String
s。手动调用System.gc()
降低了速率,但仍然存在速率。我现在使用的是VisualVM,当我点击“执行GC”时,它大大减少了内存的使用量。它是否使用“特殊”GC?再次非常非常提前地感谢您!你已经了解这个博客里的所有内容了吗?谢谢你,凯斯兰!我remove()
并检查size()
,它始终在0
附近报告。有没有可能一个WebSocketClient
即使已从地图中删除,它仍然存在?提前非常感谢@迈克尔非常感谢你,迈克尔!堆转储显示大量的char[]
s和String
s。当我使用它的“performgc”时,使用的内存急剧下降。它使用的不是System.gc()
?提前非常非常感谢您!如果GC正在清理,那就不是泄漏。请记住,GC需要周期,因此JVM通常会尝试推迟垃圾收集,直到它们使用了大量内存并需要恢复它。
ConcurrentHashMap<String, MyClass> m =
new ConcurrentHashMap<String, MyClass>(8, 0.9f, 1);