Как я знал в JVM от Sun, вся куча должна быть расположена в непрерывном адресном пространстве. Я предполагаю, что для больших значений кучи довольно сложно добавить в ваше адресное пространство после запуска, при этом гарантируя, что оно остается непрерывным. Вам, вероятно, нужно получить его при запуске, или нет вообще. Таким образом, это исправлено.
Даже если не все используются сразу, адресное пространство для всей кучи резервируется при запуске. Если он не может зарезервировать достаточно большой непрерывный блок адресного пространства для значения -Xmx, которое вы передаете, он не запустится. Вот почему трудно выделить> 1,4 ГБ кучи в 32-разрядной Windows - потому что трудно найти непрерывное адресное пространство такого размера или больше, поскольку некоторые библиотеки DLL загружаются в определенных местах, фрагментируя адресное пространство. На самом деле это не проблема, когда вы переходите на 64-разрядную версию, поскольку адресного пространства намного больше.
Это почти наверняка по соображениям производительности. Я не смог найти потрясающую ссылку, подробно описывающую это, но вот довольно хорошая цитата Питера Кесслера ( полная ссылка - обязательно прочитайте комментарии), которую я нашел при поиске. Я считаю, что он работает над JVM в Sun.
Причина, по которой нам нужна непрерывная память
область для кучи в том, что у нас есть
куча побочных структур данных, которые
индексируется (масштабируется) смещениями от
начало кучи. Например, мы
отслеживать обновления объекта ссылки с
«массив меток карты», имеющий один байт
за каждые 512 байтов кучи. Когда мы
сохранить ссылку в куче у нас есть
отметить соответствующий байт в
массив карт Мы прямо сдвигаем
адрес назначения магазина и
используйте это для индексации массива карт.
Веселые решения арифметических игр вы
не могу сделать в Java, что вы получите (есть
играть :-) в C ++.
Это было в 2004 году - я не уверен, что изменилось с тех пор, но я почти уверен, что оно все еще сохраняется. Если вы используете такой инструмент, как Process Explorer, вы увидите, что виртуальный размер (добавьте столбцы виртуального размера и памяти частного размера) приложения Java включает в себя общий размер кучи (плюс, несомненно, другое необходимое пространство) с точки запуска даже если память, «используемая» процессом, не будет где-то рядом, пока куча не начнет заполняться ...