打字猴:1.70044516e+09
1700445160
1700445161 Exception in thread”main”最大可用内存:63M
1700445162
1700445163 java.lang.OutOfMemoryError:Java heap space
1700445164
1700445165 at java.util.HashMap.resize(HashMap.java:462)
1700445166
1700445167 at java.util.HashMap.addEntry(HashMap.java:755)
1700445168
1700445169 at java.util.HashMap.put(HashMap.java:385)
1700445170
1700445171 at Client.main(Client.java:24)
1700445172
1700445173 对内存大小:63M
1700445174
1700445175 空闲内存:7M
1700445176
1700445177 内存溢出了!可能会有读者说,这很好解决,在运行时增加“-Xmx”参数设置内存大小即可。这确实可以,不过浮于表面了,没有真正从溢出的最根本原因上来解决问题。
1700445178
1700445179 难道是String字符串太多了?不对呀,字符串对象加起来撑死也就10MB,而且这里还空闲了7MB内存,不应该报内存溢出呀?
1700445180
1700445181 或者是put方法有缺陷,产生了内存泄露?不可能,这里还有7MB内存可用,应该要用尽了才会出现内存泄露啊。
1700445182
1700445183 为了更加清晰地理解该问题,我们与ArrayList做一个对比,把相同数据插入到ArrayList中看看会怎么样,代码如下:
1700445184
1700445185 public static void main(String[]args){
1700445186
1700445187 List<String>list=new ArrayList<String>();
1700445188
1700445189 /*Runtime增加的钩子函数相同,不再赘述*/
1700445190
1700445191 //放入40万同样字符串
1700445192
1700445193 for(int i=0;i<400000;i++){
1700445194
1700445195 list.add(“key”+i);
1700445196
1700445197 list.add(“vlaue”+i);
1700445198
1700445199 }
1700445200
1700445201 }
1700445202
1700445203 同样的程序,只是把HashMap修改成了List,增加的字符串元素也相同(只是HashMap将其拆分成了两个字符串,一个是key,一个是value,此处则是把两个字符串放到list中),我们来看运行结果:
1700445204
1700445205 最大可用内存:63M
1700445206
1700445207 对内存大小:63M
1700445208
1700445209 空闲内存:11M
[ 上一页 ]  [ :1.70044516e+09 ]  [ 下一页 ]