My test code is:
int SIZE = 1900; int[][] array = new int[SIZE][]; for (int i = 0; i < SIZE; i++) { array[i] = new int[1024 * 1024 / 4]; // 1MB Thread.sleep(10); if (i % 100 == 0 && i != 0) { System.out.println(i + "Mb added"); } }
I run it with arguments in java 8 -Xmx2048m -XX:+UseG1GC -XX:+PrintGCDetails
And it does not work with OutOfMemory when only 1G is consumed.
Heap garbage-first heap total 2097152K, used 1048100K [0x0000000080000000, 0x0000000080104000, 0x0000000100000000) region size 1024K, 1 young (1024K), 0 survivors (0K) Metaspace used 3273K, capacity 4496K, committed 4864K, reserved 1056768K class space used 358K, capacity 388K, committed 512K, reserved 1048576K
I see that the size of the allocated G1 is 2G, and I suppose the JVM is trying to allocate more and does not work with OOM. But why is he trying to allocate more if half the memory is free?
With UseConcMarkSweepGC it works fine and the array is full.
source share