Does garbage collection happen immediately after Hashmap.remove() is called?

garbage-collection, java, out-of-memory

Solution

Try rewriting the code as follows and you should not get OOME's ...

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);
}

The problem with your original code is that:

- you only create one list,

- you keep adding more and more elements to it, and

- that list only becomes garbage when the code completes ... because it is "in scope" the whole time.

Moving the `list` declaration inside the loop means that a new `ArrayList` is created and filled in each loop iteration, and becomes garbage when you start the next iteration.

Someone suggested calling `System.gc()`. It won't help at all in your case because there is minimal1 garbage to be collected. And in general it is a bad idea because:

- the GC is guaranteed to have run immediately before an OOME is thrown,

- the JVM can figure out better than you can when is the best (i.e. most efficient) time to run the GC,

- your call to `System.gc()` may be totally ignored anyway. The JVM can be configured so that calls to `System.gc()` are ignored.

1 - The pedant in me would like to point out that `map.put(i, list); map.remove(i);` is most likely generating an `Integer` object that most likely becomes garbage. However, this is "chicken feed" compared to your indefinitely growing `ArrayList` object.

Problem

The Java code is as follows: ``` 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); } ``` when `i` reaches 37553 , `java.lang.OutOfMemoryError: Java heap space` happens. It seems that garbage collection does not happen in the loop. Now I wonder how to fix the problem.

Original source