用完了,直接Close掉就可以了吧!

解决方案 »

  1.   

    你把声明Map放到循环外,到循环里再去new不就可以了.
    如:Map map;
    循环里map = new HashMap();
      

  2.   

    答:为什么不能这样做呢?
    for (int i = 0; i  < 10000; i++) { 
    Map map = new HashMap(); //将这一句移到循环外不就行了。因为:程序看不出:要new这么多东西干什么。
    以上仅供你参考
      

  3.   

    用完了,直接Close掉就可以了吧! 你这个办法是不是说map.clear();?这样管用吗?二楼你说声明到循环体之外,这么做和我的代码还想没有什么不一样吧?
      

  4.   

    答:放到循环外,与你的贴出来的程序功能是一样的啊。即:只要一个Map就行了。Map是一个局部变量,它一死亡,它的空间就自动释放(注意:它当中的元素对象空间,若没有人再用,才会释放。但这个与Map已经无关了)
      

  5.   

    楼上的,我明白你的意思了,放在循环体外,每次循环以后,原来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;

    }
      

  6.   

    答:放在循环外面与里面,内存与运行时间很不一样啊。放在外面,只分配一个Map内存。而放在循环中,每循环一次,都从内存中分配一次(这个要耗时,又耗内存),马上又释放(又要耗时),这两个可是要重复10000次啊。因此,显然要放在循环外面啊
      

  7.   

    答:另外,在1万次的循环内部,怎么样也不要调用map.clear()方法,理由是:这个方法很耗时,你又要重复一万次,它无非是把内部元素清空,倒不如直接:map=null。还是放在循环外面比较好。
    以上仅供你参考
      

  8.   

    谢谢,明白了。我刚开始对你的解释有些误解,Map放在循环外部时,内存空间中只有一个Map引用,而放在里面,会有很多引用。但是这个问题和触发垃圾回收还是显得无能为力,所以我觉得map = null还是一个比较现实的办法。
      

  9.   

    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急剧庞大
      

  10.   

    楼上的朋友你这个方法有点问题吧。。好像不是我想要的结果了。而且你这么做确实不会生成多余的map,但是总是调用map.remove()方法效率也不太高吧我觉得
      

  11.   

    这个问题不用讨论了lz
    即便你不使用map=null也一样会被垃圾回收器发现的,你这么做了,发现了也不一定回收的,回不回收要看你当前内存使用情况而定的.另外我觉得你的程序也没什么问题,我不并认为map.clear(); 性能很高.有点鸡肋的感觉.如果你知道map的大小new的时候可以指定下基准大小,我觉得这是唯一可以改善的地方.
      

  12.   

    因为java虚拟机会在某个时刻去清理垃圾,在清理垃圾的时候程序就会慢很多的。一般情况是你的内存用的差不多了才进行清理的,即便把map赋为null那么以前生成的那个map对象也会依然存在的。也就是不断生成map对象,直道内存快耗尽了JVM才会清理垃圾,并且清理垃圾的时候要删除你生成的,几百个上千个的map对象非常耗时,由于你map里面存放的东西也不是很多的,所以建议还是用完清空一下。要么你就每次给Map复制的时候给他的key一个增长规律,循环赋值结束后,记住这个key利于15,然后下次就从16开始,但是这样会导致map对象急剧庞大,最终由于这么对象还一值在使用,不能被释放,所以会导致内存耗尽,程序崩溃