Имейте в виду, что Windows имеет управление виртуальной памятью, а JVM требуется только непрерывная память в ее адресном пространстве . Таким образом, другие программы, работающие в системе, не обязательно должны влиять на размер вашей кучи. На вашем пути окажутся библиотеки DLL, которые загружаются в ваше адресное пространство. К сожалению, оптимизация в Windows, которая минимизирует перемещение библиотек DLL во время компоновки, повышает вероятность того, что у вас будет фрагментированное адресное пространство. Вещи, которые могут врезаться в ваше адресное пространство помимо обычных вещей, включают в себя программное обеспечение для обеспечения безопасности, программное обеспечение CBT, шпионское ПО и другие виды вредоносных программ. Возможные причины отклонений - различные исправления безопасности, версии среды выполнения C и т. Д. Драйверы устройств и другие биты ядра имеют свое собственное адресное пространство (остальные 2 ГБ 32-разрядного пространства 4 ГБ).
Вы можете попробовать пройти через ваши привязки DLL в процессе JVM и посмотреть на попытку перенести ваши DLL в более компактное адресное пространство. Не весело, но если вы в отчаянии ...
Кроме того, вы можете просто переключиться на 64-битную Windows и 64-битную JVM. Несмотря на то, что другие предложили, несмотря на то, что он потребляет больше оперативной памяти, у вас будет намного больше непрерывного виртуального адресного пространства, и выделение 2 ГБ непрерывно будет тривиальным.