Java 在调用Hashmap.remove()之后是否立即进行垃圾收集?

Java 在调用Hashmap.remove()之后是否立即进行垃圾收集?,java,garbage-collection,out-of-memory,Java,Garbage Collection,Out Of Memory,Java代码如下所示: Random r = new Random(1234697890); HashMap<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>(); List<Integer> list = new ArrayList<Integer>(); for(int i=0;i<100000;i++){ for(int

Java代码如下所示:

Random r = new Random(1234697890);
HashMap<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>();
List<Integer> list = new ArrayList<Integer>();

for(int i=0;i<100000;i++){
    for(int j=0;j<1000;j++){
        list.add(r.nextInt(100000));
    }
    map.put(i, list);
    map.remove(i);
}
Random r=新随机数(1234697890);
HashMap=newHashMap();
列表=新的ArrayList();

对于(int i=0;i您始终使用相同的列表,当循环退出时,该列表包含100000*1000项。要使GC摆脱您的列表,您需要将其范围缩小到(i)
循环的
范围内


换句话说,map和list在该代码段中始终是可访问的,因此不符合收集条件。

在您的情况下,您将继续填充相同的
列表(即使您将其从HashMap中删除,它仍然作为局部变量存在)


JVM承诺在抛出
OutOfMemoryError
之前进行完整的垃圾收集。因此,您可以确保没有任何东西需要清理。

尝试按照以下方式重写代码,您不应该得到OOME的

Random r = new Random(1234697890);
HashMap<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>();

for(int i=0;i<100000;i++){
    List<Integer> list = new ArrayList<Integer>();
    for(int j=0;j<1000;j++){
        list.add(r.nextInt(100000));
    }
    map.put(i, list);
    map.remove(i);
}
Random r=新随机数(1234697890);
HashMap=newHashMap();
对于(int i=0;i您的代码

List<Integer> list = new ArrayList<Integer>();

for(int i=0;i<100000;i++){
    for(int j=0;j<1000;j++){
        list.add(r.nextInt(100000));
    }
    map.put(i, list);
    map.remove(i);
}

你总是添加到列表中,并且从不从它移除。Fuy,GuAVA有一个<代码> MultIMAP < /代码>一组类,实现了<代码> map < /Cord>,并负责为你创建列表。@ JangB--这怎么可能与问题有关?@感知这就是为什么我把它标记为FYI。我认为信息共享是一件好事和T。第一次有人给我看Multimap时,我非常感激。或者,你可以增加堆的大小,这样方法就可以完成,然后所有的东西都可以被GC:d
List<Integer> list = new ArrayList<Integer>();

for(int i=0;i<100000 * 1000; i++) {
    list.add(r.nextInt(100000));
}
list.add(r.nextInt(128));