1700445111
编写高质量代码:改善Java程序的151个建议 建议78:减少HashMap中元素的数量
1700445112
1700445113
在系统开发中,我们经常会使用HashMap作为数据集容器,或者是用缓冲池来处理,一般很稳定,但偶尔也会出现内存溢出的问题(如OutOfMemory错误),而且这经常是与HashMap有关的,比如我们使用缓冲池操作数据时,大批量的增删查改操作就可能会让内存溢出,下面建立一段模拟程序,重现该问题,代码如下:
1700445114
1700445115
public static void main(String[]args){
1700445116
1700445117
Map<String, String>map=new HashMap<String, String>();
1700445118
1700445119
final Runtime rt=Runtime.getRuntime();
1700445120
1700445121
//JVM终止前记录内存信息
1700445122
1700445123
rt.addShutdownHook(new Thread(){
1700445124
1700445125
@Override
1700445126
1700445127
public void run(){
1700445128
1700445129
StringBuffer sb=new StringBuffer();
1700445130
1700445131
long heapMaxSize=rt.maxMemory()>>20;
1700445132
1700445133
sb.append(“最大可用内存:”+heapMaxSize+“M\n”);
1700445134
1700445135
long total=rt.totalMemory()>>20;
1700445136
1700445137
sb.append(“对内存大小:”+total+“M\n”);
1700445138
1700445139
long free=rt.freeMemory()>>20;
1700445140
1700445141
sb.append(“空闲内存:”+free+“M”);
1700445142
1700445143
System.out.println(sb);
1700445144
1700445145
}
1700445146
1700445147
});
1700445148
1700445149
//放入近40万键值对
1700445150
1700445151
for(int i=0;i<393217;i++){
1700445152
1700445153
map.put(“key”+i,“vlaue”+i);
1700445154
1700445155
}
1700445156
1700445157
}
1700445158
1700445159
该程序只是向Map中放入了近40万个键值对元素(不是整40万个,而是393217个,为什么呢?请继续往后看),只是增加,没有任何其他操作。想想看,会出现什么问题?内存溢出?运行结果如下所示:
[
上一页 ]
[ :1.70044511e+09 ]
[
下一页 ]