Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ConcurrentHashMap内存管理还是替代方案?_Java_Concurrenthashmap_Java Websocket - Fatal编程技术网

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

Java ConcurrentHashMap内存管理还是替代方案?,java,concurrenthashmap,java-websocket,Java,Concurrenthashmap,Java Websocket,as值的ConcurrentHashMap内存不断增长 我已将其隔离到代码部分,该部分尝试每秒重新连接到一个对等白名单。我已经测试了连接失败后条目是否被正确删除,它们确实被删除了。我还查看了所有我能找到的关于“concurrenthashmap内存泄漏”的信息 我不知道如何实施。这个解决方案解决问题了吗?如果是,请提供示例代码 我试图实现 ConcurrentHashMap m= 新的ConcurrentHashMap(8,0.9f,1); 我认为这在一定程度上减缓了增长速度,但我不知道如何调

as值的
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);