Мне всегда удавалось выделить 1400 мегабайт для Java SE, работающей на 32-битной Windows XP (Java 1.4, 1.5 и 1.6).
java -Xmx1400m ...
Сегодня я попробовал тот же вариант на новом компьютере с Windows XP, используя Java 1.5_16 и 1.6.0_07, и получил ошибку:
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
Методом проб и ошибок оказалось, что 1200 мегабайт - это максимум, который я могу выделить на этой машине.
Есть идеи, почему одна машина позволяет 1400, а другая только 1200?
Изменить: машина имеет 4 ГБ оперативной памяти с примерно 3,5 ГБ, которые Windows может распознать.
Ответы:
Имейте в виду, что в Windows есть управление виртуальной памятью, а JVM требуется только память, непрерывная в ее адресном пространстве . Таким образом, другие программы, работающие в системе, не обязательно должны влиять на размер вашей кучи. Вам будут мешать библиотеки DLL, которые загружаются в ваше адресное пространство. К сожалению, оптимизации в Windows, которые минимизируют перемещение DLL во время компоновки, повышают вероятность того, что у вас будет фрагментированное адресное пространство. В число вещей, которые могут попасть в ваше адресное пространство, помимо обычных вещей, входят программное обеспечение безопасности, программное обеспечение CBT, шпионское ПО и другие формы вредоносного ПО. Вероятными причинами расхождений являются различные исправления безопасности, версии среды выполнения C и т. Д. Драйверы устройств и другие биты ядра имеют свое собственное адресное пространство (другие 2 ГБ из 4 ГБ 32-разрядного пространства).
Вы можете попробовать выполнить привязку DLL в процессе JVM и попытаться перебазировать вашу DLL в более компактное адресное пространство. Не весело, но если ты в отчаянии ...
В качестве альтернативы вы можете просто переключиться на 64-битную Windows и 64-битную JVM. Несмотря на то, что предлагали другие, хотя он потребляет больше оперативной памяти, у вас будет гораздо больше непрерывного виртуального адресного пространства, и выделение 2 ГБ непрерывно будет тривиальным.
источник
Это связано с непрерывной памятью.
Вот некоторая информация, которую я нашел в Интернете для тех, кто спрашивал об этом раньше, предположительно от "бога виртуальных машин":
источник
Ограничения на размер кучи Java для Windows:
Это не поможет вам увеличить кучу Java, но теперь вы знаете, что не можете выйти за рамки этих значений.
источник
Oracle JRockit , который может обрабатывать несмежную кучу, может иметь размер кучи Java 2,85 ГБ в Windows 2003 / XP с переключателем / 3GB. Кажется, что фрагментация может сильно повлиять на размер кучи Java.
источник
JVM требуется непрерывная память, и в зависимости от того, что еще работает, что выполнялось раньше и как Windows управляла памятью, вы можете получить до 1,4 ГБ непрерывной памяти. Я думаю, что 64-битная Windows допускает большие кучи.
источник
JVM Sun требует непрерывную память. Таким образом, максимальный объем доступной памяти определяется фрагментацией памяти. В частности, DLL-файлы драйверов имеют тенденцию фрагментировать память при загрузке по некоторому предопределенному базовому адресу. Итак, ваше оборудование и его драйверы определяют, сколько памяти вы можете получить.
Два источника для этого с заявлениями инженеров Sun: форум блог
Может еще одна JVM? Вы пробовали Harmony ? Думаю, они планировали разрешить прерывистую память.
источник
Я думаю, что это больше связано с тем, как настроена Windows, как намекает этот ответ: Java -Xmx Option
Еще несколько тестов: мне удалось выделить 1300 МБ на старой машине с Windows XP, имея всего 768 МБ физической памяти (плюс виртуальная память). На моем компьютере с 2 ГБ оперативной памяти я могу получить только 1220 МБ. На различных других корпоративных машинах (со старой Windows XP) мне удалось получить 1400 МБ. Машина с ограничением в 1220 МБ довольно новая (только что купленная у Dell), поэтому, возможно, она имеет более новые (и более раздутые) Windows и библиотеки DLL (она работает под управлением Window XP Pro версии 2002 SP2).
источник
Я получил это сообщение об ошибке при запуске java-программы с виртуального VPS (с ограниченным объемом памяти). Я не указывал никаких аргументов памяти и обнаружил, что мне нужно явно установить небольшую величину, поскольку значение по умолчанию должно быть слишком большим. Например, -Xmx32m (очевидно, необходимо настроить в зависимости от запускаемой программы).
Просто поместите это здесь на случай, если кто-то еще получит указанное выше сообщение об ошибке, не указав большой объем памяти, как это сделал вопрошатель.
источник
Sun JDK / JRE требует непрерывного объема памяти, если вы выделяете огромный блок.
ОС и начальные приложения имеют тенденцию выделять фрагменты во время загрузки, которые фрагментируют доступную оперативную память. Если непрерывный блок НЕ доступен, SUN JDK не может его использовать. JRockit от Bea (приобретенный Oracle) может распределять память по частям.
источник
Кажется, что все говорят о непрерывной памяти, но забыли признать более насущную проблему.
Даже при 100% непрерывном распределении памяти у вас не может быть размера кучи 2 ГиБ в 32-разрядной ОС Windows (* по умолчанию). Это связано с тем, что 32-разрядные процессы Windows не могут обрабатывать более 2 ГиБ пространства.
Процесс Java будет содержать perm gen (до Java 8), размер стека на поток, накладные расходы JVM / библиотеки (которые в значительной степени увеличиваются с каждой сборкой) в дополнение к куче .
Кроме того, флаги JVM и их значения по умолчанию меняются от версии к версии. Просто запустите следующее, и вы получите некоторое представление:
Многие параметры влияют на разделение памяти в куче и из нее. Оставляя вам более или менее 2 ГиБ для игры ...
Чтобы повторно использовать части этого моего ответа (о Tomcat, но применимо к любому процессу Java):
источник
Вот как увеличить размер подкачки
источник
** Существует множество способов изменить размер кучи, например,
Для меня сработало
Установите правильный путь JAVA_HOME, если вы обновили java.
создать новую системную переменную компьютер-> свойства-> расширенные настройки- > создать новую системную переменную
имя: _JAVA_OPTION значение: -Xmx750m
К вашему сведению: вы можете найти вариант VM по умолчанию в Intellij help- > edit custom VM option , В этом файле вы видите минимальный и максимальный размер кучи. **
источник
Во-первых, бесполезно использовать файл подкачки, когда у вас 4 ГБ ОЗУ. Windows не может получить доступ к более чем 4 ГБ (на самом деле, меньше из-за дыр в памяти), поэтому файл подкачки не используется.
Во-вторых, адресное пространство делится на две части: половина для ядра, половина для пользовательского режима. Если вам нужно больше ОЗУ для ваших приложений, используйте параметр / 3GB в boot.ini (убедитесь, что java.exe помечен как «большой адрес» (дополнительную информацию можно найти в Google).
В-третьих, я думаю, вы не можете выделить полные 2 ГБ адресного пространства, потому что java тратит некоторую внутреннюю память (для потоков, JIT-компилятора, инициализации виртуальной машины и т. Д.). Для получения дополнительных сведений используйте переключатель / 3GB.
источник