ConcurrentHashMap内存泄漏问题

博客讲述了在测试代码中,ConcurrentHashMap在仅添加一个元素时导致内存溢出的问题。通过排查发现,错误地设置了初始化容量,使得在put元素时创建了一个巨大的HashEntry数组,从而消耗了大量内存。解决办法是合理设置初始化参数。
摘要由CSDN通过智能技术生成

问题背景

上周,同事写了一段ConcurrentHashMap的测试代码,说往map里放了32个元素就内存溢出了,我大致看了一下他的代码及运行的jvm参数,觉得很奇怪,于是就自己捣鼓了一下。首先上一段代码:

 1 public class MapTest {
 2 
 3     public static void main(String[] args) {
 4         System.out.println("Before allocate map, free memory is " + Runtime.getRuntime().freeMemory()/(1024*1024) + "M");
 5         Map<String, String> map = new ConcurrentHashMap<String, String>(2000000000);
 6         System.out.println("After allocate map, free memory is " + Runtime.getRuntime().freeMemory()/(1024*1024) + "M");
 7 
 8         int i = 0;
 9         try {
10             while (i < 1000000) {
11                 System.out.println("Before put the " + (i + 1) + " element, free memory is " + Runtime.getRuntime().freeMemory()/(1024*1024) + "M");
12                 map.put(String.valueOf(i), String.valueOf(i));
13                 System.out.println("After put the " + (i + 1) + " element, free memory is " + Runtime.getRuntime().freeMemory()/(1024*1024) + "M");
14                 i++;
15             }
16         } catch (Exception e) {
17             e.printStackTrace();
18         } catch (Throwable t) {
19             t.printStackTrace();
20         } finally {
21             System.out.println("map size is " + map.size());
22         }
23     }
24 
25 }

执行时加上jvm执行参数 -Xms512m -Xmx512m ,执行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值