Не удалось зарезервировать достаточно места для кучи объектов


277

Я получаю следующее исключение несколько раз каждый раз, когда пытаюсь запустить программу.

Произошла ошибка при инициализации ВМ

Не удалось зарезервировать достаточно места для кучи объектов

Не удалось создать виртуальную машину Java.

Я пытался увеличить свою виртуальную память (размер страницы) и объем оперативной памяти, но безрезультатно.

Как я могу устранить эту ошибку?



2
Я также получаю эту ошибку при использовании jdk / jre 1.6 на моей виртуальной машине, пытался изменить значения конфигурации, указанные в комментариях, но это не помогло, после обновления до jdk 1.7 ошибка исчезла и были применены более крупные параметры Xmx. Кажется, есть много изменений с использованием кучи, начиная с Java 1.6.
Александр.

Ответы:


214

Запустите JVM с -XX:MaxHeapSize=512m(или любым большим числом, как вам нужно) (или -Xmx512mдля краткости)


42
Или короче, -mx256m или -mx512m;)
Питер Лори

8
-Mx - это то же самое, что -Xmx и -XX: MaxHeapSize?
Эрти Сейдохл

19
Спасибо .. оказывается, слишком большое число также может быть проблемой и может выдать ту же ошибку!
Динеш Раджан

17
Кто-нибудь нашел решение, которое на самом деле работает 100% времени? Это решение временно решает проблему, но затем внезапно возвращается. У меня есть 16 ГБ оперативной памяти, и я устал от этого дерьма. В старые времена все было лучше: [
Нильзор

6
Не работает для меня в Windows 8 с x86 или x64 Java.
AndrewSmiley

128

Это также может быть вызвано установкой чего-то слишком большого в 32-разрядной версии HotSpot vm, например:

-Xms1536m -Xmx1536m

где это может / будет работать:

-Xms1336m -Xmx1336m

5
Я забыл упомянуть, что эта проблема должна возникать при запуске в 32-битной командной оболочке. 64-битная командная оболочка может не иметь этой проблемы.
Джангофан

Для меня это не удалось со значением по умолчанию и со слишком большим значением, поэтому убедитесь, что вы пытаетесь несколько значений. Спасибо за ответ!
Trax

47

вот как это исправить:

  • Перейдите в Пуск-> Панель управления-> Система-> Дополнительно (вкладка) -> Переменные среды-> Система

    Переменные-> Новый: Имя переменной: _JAVA_OPTIONS Значение -Xmx512M переменной: Имя Path
    переменной: Значение переменной:%PATH%;C:\Program Files\Java\jre6\bin;F:\JDK\bin;

Измените это на свой подходящий путь.


1
Очень похоже на этот ответ , я бы сказал ...
That1Guy

Хороший. Наряду с вышесказанным обратитесь и к этому. stackoverflow.com/a/9350506/967638
Амарнат

46

Я столкнулся с этим при использовании javac, и он, похоже, не учитывает параметры командной строки,

-bash-3.2$ javac -Xmx256M HelloWorldApp.java 
Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

так что решение здесь так установить _JAVA_OPTIONS

-bash-3.2$ export _JAVA_OPTIONS="-Xmx256M"
-bash-3.2$ javac HelloWorldApp.java 
Picked up _JAVA_OPTIONS: -Xmx256M

И это хорошо компилируется.

Это происходит со мной на машинах с большим количеством оперативной памяти, но с меньшим объемом памяти. Java решает выделить большую кучу, потому что обнаруживает оперативную память в машине, но ей не разрешено выделять ее из-за ограничений.


1
+1 за указание _JAVA_OPTIONS - в моем случае java вызывается откуда-то глубоко внутри сценария оболочки, к которому у меня нет доступа на запись, поэтому этот вариант предпочтительнее.
геррит

Тоже самое. Я использую компьютеры университетов, поэтому я не являюсь администратором (не могу изменить переменные среды), а опция командной строки вообще не работала. Спасибо!
Кимблей

38

32-битная Java требует непрерывного свободного места в памяти для запуска. Если вы укажете большой размер кучи, свободного места в памяти может быть не так много, даже если у вас будет гораздо больше свободного места, чем необходимо.

Установка 64-битной версии Java помогает в этих случаях, непрерывные требования к памяти относятся только к 32-битной Java.


1
Я думаю, что это лучший ответ, если вы продолжаете получать ошибку после использования опции -Xmx [bignumber] m. Помог мне правильно запустить Apache jMeter.
RuudvK

Я создал совершенно новый проект без кода, кроме автоматически сгенерированного основного действия, и он выдал эту ошибку
behelit

1
Я второй @RuudvK. Установка 64-разрядной версии позволила мне увеличить максимальный объем памяти, одновременно устраняя ошибку выделения памяти. Это должен быть принятый ответ.
J Weezy

28

В сочетании с -Xmx512M используйте -d64, чтобы убедиться, что вы используете 64-битную виртуальную машину. На 64-битной машине я точно думал, что использую 64-битную виртуальную машину, но нет. После установки 64-битной Java работает опция -d64, а -Xmx позволяет значительно увеличить объем памяти.

java -d64 -Xmx512M mypackage.Test

4
Этот ответ должен быть наверху. Потратил два месяца на борьбу с этой проблемой, просто чтобы понять, что установка 64-битной Java решила эту проблему (опция -d64 в моем случае не требовалась)
Nilzor

Взял _JAVA_OPTIONS: -d64 -Xmx1024M Нераспознанная опция: -d64 Не удалось запустить JVM. Максимальный размер кучи (-Xmx) может быть слишком большим, или антивирус или брандмауэр могут заблокировать выполнение.
Александр

14

Я получил ту же ошибку и решил ее, настроив ее в файле run.conf.bat

Запустите JVM с настройкой run.conf.bat в Jboss5x

Если свободная память недоступна, поскольку вы передаете оператор, внесите изменения в файл run.conf.bat

set "JAVA_OPTS=-Xms512m -Xmx512m -XX:MaxPermSize=256m"

7

Я знаю, что здесь уже есть много ответов, но ни один из них не помог мне. В конце концов я открыл файл /etc/elasticsearch/jvm.optionsи изменил:

-Xms2G
-Xmx2G

в

-Xms256M
-Xmx256M

Это решило это для меня. Надеюсь, это поможет кому-то еще здесь.


7

У меня были похожие проблемы. Я установил 32-битную версию Java на 64-битной машине.

Удалив эту версию и установив 64-битную версию Java. Я был в состоянии решить проблему.


6

Предположим, ваш класс вызывается Testв пакете mypackage. Запустите ваш код так:

java -Xmx1024m mypackage.Test

Это зарезервирует 1024 МБ кучи для вашего кода. Если вы хотите 512 МБ, вы можете использовать:

java -Xmx512m mypackage.Test

Используйте немного м 1024m, 512mи т. Д.


6

Иногда эта ошибка указывает на то, что физическая память и своп на сервере фактически используются полностью!

Недавно я видел эту проблему на сервере под управлением RedHat Enterprise Linux 5.7 с 48 ГБ оперативной памяти. Я обнаружил, что даже просто работает

java -version

вызвал ту же ошибку, которая установила, что проблема не была характерна для моего приложения.

Бег

cat /proc/meminfo

сообщили, что значения MemFree и SwapFree значительно ниже 1% значений MemTotal и SwapTotal, соответственно:

MemTotal:     49300620 kB
MemFree:        146376 kB
...
SwapTotal:     4192956 kB
SwapFree:         1364 kB

Остановка нескольких запущенных приложений на машине несколько увеличила объем свободной памяти:

MemTotal:     49300620 kB
MemFree:       2908664 kB
...
SwapTotal:     4192956 kB
SwapFree:      1016052 kB

В этот момент новый экземпляр Java запустится нормально, и я смог запустить свое приложение.

(Очевидно, для меня это было лишь временное решение; у меня все еще есть нерешенная задача - более тщательно изучить процессы, запущенные на этой машине, чтобы выяснить, можно ли что-то сделать, чтобы снизить номинальные уровни использования памяти, без приходится прибегать к остановке приложений.)


То же самое здесь, java -versionне удалось, хотя top показал некоторые бесплатные еще: | (также сказал, что Ошибка произошла во время инициализации ВМ. Иногда не удается зарезервировать достаточно места для массива маркировки карт). Исправление, казалось, было для запуска top, поиска, какие процессы использовали больше всего оперативной памяти (столбец VIRT), уничтожения их [postgres, appdynamics for me]: |
rogerdpack

Может ли это быть из-за фрагментации памяти? Ответ выше упоминает смежное свободное пространство.
Рик Мориц

6

Ошибка :

Для ошибки "ошибка произошла во время инициализации vm, не мог зарезервировать достаточно места для кучи объекта jboss"

Основная причина :

  • Неправильное / недостаточное выделение памяти для нашей JVM, как указано ниже.

  • например, JAVA_OPTS = "- Xms1303m -Xmx1303m -XX: MaxPermSize = 256m" в jboss-eap-6.2 \ bin \ standalone.conf или "JAVA_OPTS = -Xms1G -Xmx1G -XX: MaxPermSize = 256M" в jboss-e \ standalone.conf.bat, который является ничем иным, как параметрами пула выделения памяти JVM.

Разрешение :

  • Увеличьте размер кучи. Чтобы увеличить размер кучи,
  • Перейти -> jboss-eap-6.2 \ bin \ standalone.conf.bat или jboss-eap-6.2 \ bin \ standalone.conf
  • изменить -> JAVA_OPTS = "- Xms256m -Xmx512m -XX: MaxPermSize = 256m", где -Xms - минимальный размер кучи, а -Xmx - максимальный размер кучи.
  • Обычно его не рекомендуется иметь одинаковый размер для мин и макс.

  • Если вы запускаете свое приложение из Eclipse,

  • Двойной клик на сервере
  • выберите «Открыть конфигурацию запуска», и вы будете перенаправлены в окно «Редактировать свойства конфигурации запуска».
  • В этом ветре перейдите на вкладку «(x) = Аргументы».
  • В VM Arguments определите размер кучи, как указано ниже
  • "-Dprogram.name = JBossTools: JBoss EAP 6.1+ Runtime Server" -server -Xms256m -Xmx512m -XX: MaxPermSize = 256m -Dorg.jboss.resolver.warning = true

Цитата из справочника командной строки Oracle : « Для лучшей производительности установите -Xms равным максимальному размеру кучи, например:java -Xgcprio:throughput -Xmx:64m -Xms:64m myApp »
user1438038

3

Я недавно столкнулся с этой проблемой. У меня есть 3 Java-приложения, которые начинаются с кучи размером 1024 м или 1280 м. Java ищет доступное пространство в разделе подкачки, и, если недостаточно памяти, jvm завершает работу.

Чтобы решить эту проблему, мне пришлось закрыть несколько программ, у которых было выделено большое количество виртуальной памяти.

Я работал на x86-64 Linux с 64-разрядной JVM.


3

У меня было правильное количество настроек памяти, но для меня это было использование 64-битного Intellij с 32-битной JVM. Когда я перешел на 64-битную виртуальную машину, ошибка исчезла.



2

Если вы используете 32-битную JVM, измените размер кучи на меньший, вероятно, это поможет. Вы можете сделать это, передав аргументы в java напрямую или через переменные окружения, такие как:

java -Xms128M -Xmx512M
JAVA_OPTS="-Xms128M -Xmx512M"

Для 64-битной JVM больший размер кучи, например -Xms512M -Xmx1536M должен работать.

Запустите java -versionили java -d32, java--d64чтобы Java7 проверила, какую версию вы используете.


1

В любом случае, вот как это исправить: Перейдите в Пуск-> Панель управления-> Система-> Дополнительно (вкладка) -> Переменные среды-> Системные переменные-> Новое: Имя переменной: _JAVA_OPTIONS Значение переменной: -Xmx512M

ИЛИ

Измените вызов муравья, как показано ниже.

   <exec
        **<arg value="-J-Xmx512m" />**
    </exec>

Это сработало для меня.


1

Произошла ошибка при инициализации виртуальной машины. Не удалось зарезервировать достаточно места для кучи объектов размером 1572864 КБ.

Я изменил значение памяти в файле settings.grade 1536 на 512, и это помогло


1

Перейдите в Пуск-> Панель управления-> Система-> Дополнительно (вкладка) -> Переменные среды-> Системные переменные-> Создать:

Variable name: _JAVA_OPTIONS
Variable value: -Xmx512M

Установка этого параметра глобально ограничивает размер кучи, который вы можете дать IntelliJ.
user3056052

0

Если вы запускаете Java-программу: - запустите вашу программу в терминале, используя правильную команду для Linux, это будет 'java -jar myprogram.jar' и добавьте -Xms256m -Xmx512m, например: 'java -jar myprogram.jar Xms256m -Xmx512m '

Если вы используете скрипт .sh (linux, mac?) Или .bat (windows), откройте сценарий и найдите параметры java, если они есть, и увеличьте объем памяти.

Если все вышеперечисленное не работает, проверьте ваши процессы (ctrl + alt + delete в windows) (ps aux в linux / mac) и убейте процессы, которые используют много памяти и не нужны вашей операционной системе! => Попробуйте перезапустить вашу программу.


0

В CASSANDRA_HOME / bin / cassandra.bat вы найдете следующую конфигурацию

REM JVM Opts we'll use in legacy run or installation
set JAVA_OPTS=-ea^
 -javaagent:"%CASSANDRA_HOME%\lib\jamm-0.3.0.jar"^
 -Xms**2G**^
 -Xmx**2G**^

Вы можете уменьшить 2G до некоторого меньшего числа, например, 1G или даже меньше, и это должно работать.

То же самое, если вы работаете на Unix Box, измените в файле .sh соответствующим образом.


0

Я получил ту же ошибку, и она была устранена, когда я удалил временные файлы, используя% temp% и перезапустив Eclipse.


0

Иногда это относится как

$ sysctl vm.overcommit_memory
vm.overcommit_memory = 2

Если вы установите его на:

$ sysctl vm.overcommit_memory=0

Он должен работать.


0

Заменить -Xmx2Gс -Xms512Mили любой больший размер памяти в cassandra.bat файл в каталоге Cassandra бен.


0

Откройте файл gradle.properties в папке Android.

Заменить эту строку:

org.gradle.jvmargs=-Xmx1536M

с участием:

org.gradle.jvmargs=-Xmx512m

Объяснение: Максимальный лимит из документа Gradle:

Если в запрашиваемой среде сборки не указан максимальный размер кучи, демон будет использовать до 512 МБ кучи.


-2

Нет необходимости делать что-либо просто в файле POM, как показано ниже

<configuration>
    <maxmemory>1024M</maxmemory>
</configuration>

2
Кто сказал что-нибудь о файле POM?
Хенли Чиу
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.