【发布时间】:2017-01-14 20:32:44
【问题描述】:
我正在尝试解决内存泄漏问题。堆转储分析显示ConcurrentHashMap 正在占用98% of heap memory 周围。检查代码,发现ConcurrentHashMap 实例化使用的是没有参数的构造函数。 concurrencyLevel 的默认配置是 16。在此映射实例化之后,我看到一个同步方法调用,其中数据被放入映射中。
我想知道,由于数据只放在同步方法中,将ConcurrentHashMap 的 concurrencyLevel 设置为 1 是否安全?
以下是示例代码sn-p:
private volatile Map<String, Integer> storeCache;
public void someMethod() {
storeCache = new ConcurrentHashMap<String, Integer>();
syncMethod();
}
private synchronized void syncMethod() {
storeCache.put("Test", 1);
}
【问题讨论】:
-
CHM 不使用任何字节数组,所以这不会有任何区别。默认 CHM 实例使用的空间至少比字节数组使用的 1 亿字节少 5 个数量级。
-
我的观点:CHM 的内部空间并没有占据 98% 的空间,而是它所包含的东西。使用 1 的并行度将一无所获。
-
您需要在应用程序代码中查找内存泄漏。有人在地图上添加了太多东西——就这么简单。您可以随时尝试将地图打印到文本文件中。
-
参考这个链接后我问了这个问题 -- ria101.wordpress.com/2011/12/12/…
-
关于 concurenthashmap 内存泄漏的一些优点在这里,在这个问题上:stackoverflow.com/questions/3959122/…
标签: java concurrency