Ну, первое, что вы должны знать, это то, что объем памяти, который вы можете выделить, не зависит от того, сколько у вас оперативной памяти. ОС управляет виртуальной памятью, а любое распределение выполняется в виртуальной памяти. Затем чанки выгружаются в RAM / Disk операционной системой. Вы не можете это контролировать. Вы можете подумать, что вы выделяете 5 МБ в оперативной памяти, но операционная система должна хранить ее в оперативной памяти или передавать ее с диска в вашу программу, когда вам это нужно. В Windows 32 bit у вас есть 2 ГБ в пользовательском пространстве для работы (остальное используется пространством ядра). В 64-битных ОС эта сумма намного больше.
Однако то, что у вас есть 2 ГБ пользовательского пространства, которое вы можете выделить (в 32-битной ОС или более в 64-битной), не означает, что вы всегда можете выделить такой большой кусок, потому что для выделения памяти требуются смежные блоки памяти. Таким образом, фрагментация памяти может стать проблемой.
В-третьих, JVM ограничивает объем памяти, который вы можете выделить. Поэтому вам нужно увеличить эти параметры на -Xms -Xmx, которые ограничивают размер кучи.
Кроме этих комментариев, у меня действительно нет решения для вас.