请教一个资源释放的问题 用完了,直接Close掉就可以了吧! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你把声明Map放到循环外,到循环里再去new不就可以了.如:Map map;循环里map = new HashMap(); 答:为什么不能这样做呢?for (int i = 0; i < 10000; i++) { Map map = new HashMap(); //将这一句移到循环外不就行了。因为:程序看不出:要new这么多东西干什么。以上仅供你参考 用完了,直接Close掉就可以了吧! 你这个办法是不是说map.clear();?这样管用吗?二楼你说声明到循环体之外,这么做和我的代码还想没有什么不一样吧? 答:放到循环外,与你的贴出来的程序功能是一样的啊。即:只要一个Map就行了。Map是一个局部变量,它一死亡,它的空间就自动释放(注意:它当中的元素对象空间,若没有人再用,才会释放。但这个与Map已经无关了) 楼上的,我明白你的意思了,放在循环体外,每次循环以后,原来map的引用就失效了。但是放在循环体里面,每个声明在以后的循环中都不会再被使用了,也一样可以触发垃圾收集阿,为什么非要放在循环体外面?有这个必要吗?你把声明放在循环体外面,Map还是一个局部变量阿。有没有能触发垃圾回收比较直接的方法?比如这样是否能及时:for (int i = 0; i < 10000; i++) { Map map = new HashMap(); int j = 1; while (j % 100 != 0) { map.put(new Integer(j), "Current Number: " + j); j++; } map.clear(); map = null;} 答:放在循环外面与里面,内存与运行时间很不一样啊。放在外面,只分配一个Map内存。而放在循环中,每循环一次,都从内存中分配一次(这个要耗时,又耗内存),马上又释放(又要耗时),这两个可是要重复10000次啊。因此,显然要放在循环外面啊。 答:另外,在1万次的循环内部,怎么样也不要调用map.clear()方法,理由是:这个方法很耗时,你又要重复一万次,它无非是把内部元素清空,倒不如直接:map=null。还是放在循环外面比较好。以上仅供你参考 谢谢,明白了。我刚开始对你的解释有些误解,Map放在循环外部时,内存空间中只有一个Map引用,而放在里面,会有很多引用。但是这个问题和触发垃圾回收还是显得无能为力,所以我觉得map = null还是一个比较现实的办法。 import java.util.*; public class ReleaseTest { public static void main(String[] args) { Map map = null ;for (int i = 0; i < 10000; i++) { int j = 1; if(map == null){ map = new HashMap(); }else{ while (j % 100 != 0) { map.remove(j); j++; } }while (j % 100 != 0) { map.put(new Integer(j), "Current Number: " + j); j++; } printMap(map); //Now, the map is useless. } } private static void printMap(Map map) { if (map != null && !map.isEmpty()) { Set entrySet = map.entrySet(); Iterator it = entrySet.iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry)it.next(); System.out.println(entry.getValue()); } } } }可以试验下这种方法。这样既不会生成多余的map对象。始终是操纵一个。又不会使Map急剧庞大 楼上的朋友你这个方法有点问题吧。。好像不是我想要的结果了。而且你这么做确实不会生成多余的map,但是总是调用map.remove()方法效率也不太高吧我觉得 这个问题不用讨论了lz即便你不使用map=null也一样会被垃圾回收器发现的,你这么做了,发现了也不一定回收的,回不回收要看你当前内存使用情况而定的.另外我觉得你的程序也没什么问题,我不并认为map.clear(); 性能很高.有点鸡肋的感觉.如果你知道map的大小new的时候可以指定下基准大小,我觉得这是唯一可以改善的地方. 因为java虚拟机会在某个时刻去清理垃圾,在清理垃圾的时候程序就会慢很多的。一般情况是你的内存用的差不多了才进行清理的,即便把map赋为null那么以前生成的那个map对象也会依然存在的。也就是不断生成map对象,直道内存快耗尽了JVM才会清理垃圾,并且清理垃圾的时候要删除你生成的,几百个上千个的map对象非常耗时,由于你map里面存放的东西也不是很多的,所以建议还是用完清空一下。要么你就每次给Map复制的时候给他的key一个增长规律,循环赋值结束后,记住这个key利于15,然后下次就从16开始,但是这样会导致map对象急剧庞大,最终由于这么对象还一值在使用,不能被释放,所以会导致内存耗尽,程序崩溃 关于使用exe4j时遇到的问题 【向ZangXT提问】嵌套if语句 vs 条件or(||)判定:哪一个更好? Swing pdf solution, PDF renderer? 如何得到package下的所有文件名称? 高手才能解决的问题 使用swing组件中的jList时遇到问题,有用过jList的请进来一下 如何在java程序中取得一个给定目录下的所有文件名? 怎样实现密码输入不回显? 怎样传送若干条信息?期待ing... to:那位大侠可以提供关于用JAVA实现FTP的客户端程序, 怎么用url类实现访问一个页面里面的一个url 用JMF播放音乐的问题
如:Map map;
循环里map = new HashMap();
for (int i = 0; i < 10000; i++) {
Map map = new HashMap(); //将这一句移到循环外不就行了。因为:程序看不出:要new这么多东西干什么。
以上仅供你参考
for (int i = 0; i < 10000; i++) {
Map map = new HashMap();
int j = 1;
while (j % 100 != 0) {
map.put(new Integer(j), "Current Number: " + j);
j++;
}
map.clear();
map = null;
}
以上仅供你参考
public static void main(String[] args) {
Map map = null ;
for (int i = 0; i < 10000; i++) {
int j = 1;
if(map == null)
{
map = new HashMap();
}
else
{
while (j % 100 != 0) {
map.remove(j);
j++;
} }
while (j % 100 != 0) {
map.put(new Integer(j), "Current Number: " + j);
j++;
}
printMap(map);
//Now, the map is useless.
}
} private static void printMap(Map map) {
if (map != null && !map.isEmpty()) {
Set entrySet = map.entrySet();
Iterator it = entrySet.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
System.out.println(entry.getValue());
}
}
}
}可以试验下这种方法。这样既不会生成多余的map对象。始终是操纵一个。又不会使Map急剧庞大
即便你不使用map=null也一样会被垃圾回收器发现的,你这么做了,发现了也不一定回收的,回不回收要看你当前内存使用情况而定的.另外我觉得你的程序也没什么问题,我不并认为map.clear(); 性能很高.有点鸡肋的感觉.如果你知道map的大小new的时候可以指定下基准大小,我觉得这是唯一可以改善的地方.