Кажется, что все говорят о непрерывной памяти, но забыли признать более насущную проблему.
Даже при 100% непрерывном распределении памяти у вас не может быть размера кучи 2 ГиБ в 32-разрядной ОС Windows (* по умолчанию). Это связано с тем, что 32-разрядные процессы Windows не могут обрабатывать более 2 ГиБ пространства.
Процесс Java будет содержать perm gen (до Java 8), размер стека на поток, накладные расходы JVM / библиотеки (которые в значительной степени увеличиваются с каждой сборкой) в дополнение к куче .
Кроме того, флаги JVM и их значения по умолчанию меняются от версии к версии. Просто запустите следующее, и вы получите некоторое представление:
java -XX:+PrintFlagsFinal
Многие параметры влияют на разделение памяти в куче и из нее. Оставляя вам более или менее 2 ГиБ для игры ...
Чтобы повторно использовать части этого моего ответа (о Tomcat, но применимо к любому процессу Java):
ОС Windows ограничивает выделение памяти 32-разрядным процессам всего 2 ГиБ (по умолчанию).
[Вы сможете] выделить около 1,5 ГиБ кучи, потому что процессу выделяется и другая память (служебные данные JVM / библиотеки, пространство для перманентного поколения и т. Д.).
Почему 32-разрядная версия Windows ограничивает адресное пространство процесса 2 ГБ, а 64-разрядная Windows - 4 ГБ?
Другие современные операционные системы [cough Linux] позволяют 32-битным процессам использовать все (или большую часть) адресного пространства 4 ГиБ.
Тем не менее, 64-битные ОС Windows могут быть настроены для увеличения лимита 32-битных процессов до 4 ГиБ (3 ГиБ для 32-битных):
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx