In Java HotSpot VM, heap is divided into "new generation" and "old generation". The array must be in either of them. The default value of ratio of new/old generation sizes is 2.
(Which actually denotes old/new=2
)
So with some simple math it can be shown an 151MB heap can have 50.33MB new generation and 100.67MB old generation. Also an 150MB heap has exactly 100MB of old generation. Your array + everything else (such as args
) will exhaust the 100MB, hence produce OutOfMemoryError
.
I tried to run with
java -Xms150m -Xmx150m -XX:+PrintGCDetails Main > c.txt
And from c.txt
(...) Heap PSYoungGen total 44800K, used 3072K (addresses...) eden space 38400K, 8% used (...) from space 6400K, 0% used (...) to space 6400K, 0% used (...) ParOldGen total 102400K, used 217K (...) object space 102400K, 0% used (...) PSPermGen total 21248K, used 2411K (...) object space 21248K, 11% used (...)
The spaces are not exactly equals to my calculations, but they are near.