«Произошла ошибка при инициализации ВМ; Не удалось зарезервировать достаточно места для кучи объектов »с использованием -Xmx3G

94

Прежде всего, у меня есть коробка с 8 ГБ оперативной памяти, поэтому я сомневаюсь, что проблема в общей памяти. Это приложение нормально работает на машинах с объемом памяти 6 ГБ или меньше.

Я пытаюсь зарезервировать 3 ГБ пространства с помощью -Xmx3G в разделе «Аргументы виртуальной машины» в конфигурациях запуска в Eclipse.

Каждый раз, когда я пытаюсь зарезервировать более 1500 МБ, я получаю такую ​​ошибку: «Произошла ошибка при инициализации ВМ; Не удалось зарезервировать достаточно места для кучи объектов »с использованием -Xmx3G

Что здесь происходит?

user1212731
источник
2
Какая у вас версия java? В какой операционной системе вы работаете?
Адам Рофер
Это была Win7, и у меня было установлено 3 разных версии Java. Одним из них была 32-битная JRE, которую использовал Eclipse.
user1212731
3
Не забудьте отметить ответ как правильный.
xdhmoore
Просто измените настройки в gridle.property в соответствии с вашим допустимым пространством
Бхушан

Ответы:

64

Может быть, вы используете 32-битную jvm на этой машине?

Лоран
источник
8
Простите за глупый вопрос, но как это проверить? А как мне использовать 64-битную?
user1212731
3
На самом деле, я просто попробовал java -d64 -version в командной строке, и у меня получилась 64-битная серверная виртуальная машина.
user1212731
6
Очевидно, Eclipse использовал 32-разрядную версию JRE, которую я установил ранее, хотя 64-разрядная версия была последней установкой. Я изменил настройки в Предпочтения -> Установленные JRE, чтобы решить эту проблему. Большое спасибо за ответ!
user1212731
3
В любом случае, разве 32 бита не хватит для адресации 4 ГБ?
Thomas
7
Так и должно быть, но это решает мою проблему. За этот ответ не проголосовали из-за отсутствия объяснения. Эта ссылка объясняет, как 32-битный jvm не может превышать максимальный размер кучи 1 ГБ
Стивен
58

Вот как это исправить: Перейти к Start->Control Panel->System->Advanced(tab)->Environment Variables->System

Variables->New:
Variable name: _JAVA_OPTIONS   
Variable value: -Xmx512M

Variable name: Path  
Variable value: ;C:\Program Files\Java\jre6\bin;F:\JDK\bin;  

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

Мохамед Адель
источник
4
Просто заметка для других. Вы добавляете переменную SYSTEM, а не переменную USER. Я столкнулся с этой проблемой в Eclipse, и мне не пришлось перезагружать машину после внесения вышеуказанных изменений ... Мне нужно было только перезапустить Eclipse. Благодарность!
captain_jim1
Для любопытных: флаг -Xmx в _JAVA_OPTIONS указывает максимально допустимый размер кучи JVM. Это не позволяет JVM запрашивать необоснованное пространство (особенно нераспределенное непрерывно для 32-битных машин ...)
varun
41

На самом деле это не проблема, связанная с Eclipse; это общая проблема Java-on-Windows. Это из-за того, как JVM распределяет память в Windows; он настаивает на выделении непрерывного фрагмента памяти, который часто Windows не может предоставить, даже если имеется достаточно отдельных фрагментов для удовлетворения запроса на выделение. Существуют утилиты, которые пытаются помочь Windows «дефрагментировать» ее память, что теоретически может помочь в этой ситуации; но я действительно не пробовал их всерьез, поэтому не могу говорить об их эффективности. Одна вещь, которую я иногда слышал, которая может помочь, - это перезагрузить Windows и перед запуском любых других приложений запустить приложение Java, которому требуется большой кусок памяти. Если вам повезет, Windows еще не фрагментировала свое пространство памяти, и Java получит непрерывный блок, который запрашивается.

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

Однако я нашел это, что выглядит полезным: https://stackoverflow.com/a/497757/639520

E-Riz
источник
2
В моем случае ваш ответ работает. Я не перезапускал окна, но я попытался закрыть другие приложения в своих окнах, а затем запустить java, и он смог запустить виртуальную машину.
sttaq
22

Во-первых, 32-битная JRE не может использовать больше ~ 1,5 ГБ оперативной памяти. Так что, если вы хотите большего, используйте 64-битную JRE.

Во-вторых, когда запускается новая JVM, это суммирует свойство -Xmx всех запущенных JVM и проверяет, достаточно ли памяти в системе для работы с их собственным -Xmx, если этого недостаточно, возникает ошибка.

Даниэль Де Леон
источник
15

Я использовал Liferay с сервером Tomcat из eclipse IDE. Я застрял с этой же ошибкой при нажатии на запуск сервера. Дважды щелкните сервер из затмения. откроется страница обзора сервера. Обновлены аргументы памяти с -Xmx1024m -XX: MaxPermSize = 256m до -Xmx512m -XX: MaxPermSize = 256m. Тогда это сработало для меня.

Пратап
источник
9

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

Чтобы быть абсолютно уверенным, я рекомендую добавить эти две строки в свой eclipse.iniфайл вверху:

-vm 
C:/Java/jdk1.6.0_27/bin

... где на моей машине C:/Java/jdk1.6.0_27/binнаходится JVM, которую я знаю, 64-разрядная. Обязательно там есть binпапка.

(В качестве бонуса в Windows 7 это также позволяет вам фактически «закрепить вкладку», поэтому мне пришлось сделать это для себя)

Адам Рофер
источник
Аргумент -vm должен указывать на исполняемый файл Java, а не только на папку. См. Wiki.eclipse.org/%C2%A0eclipse.ini#Specifying_the_JVM
E-Riz
1
Неправильно. См. Эту ошибку Eclipse: bugs.eclipse.org/bugs/show_bug.cgi?id=314805
Адам Рофер,
Это действительно была проблема! Eclipse использовал 32-разрядную версию JRE, которую я когда-то установил. Большое спасибо за ответ и за то, что направили меня в правильном направлении! Я очень ценю это.
user1212731
@AdamRofer, эта ошибка интересна, но касается именно Windows 7 и решения проблемы с закреплением Eclipse на панели задач. В общем, eclipse.ini должен указывать на исполняемый файл java, хотя средство запуска Equinox кажется разумным в том смысле, что оно будет искать исполняемый файл java, если -vm указывает на папку (по крайней мере, в Windows).
E-Riz
@ E-Riz "следует" на мой вкус слишком строго :) Надеюсь, они исправят ошибку без необходимости когда-нибудь изменять аргумент vm. Вот дополнительная информация, которую им было бы полезно обновить на своей eclipse.iniстранице: wiki.eclipse.org/…
Адам Рофер
5

Это проблема размера кучи. Отредактируйте ваш .bat(Пакетный файл). Возможно, он показывает размер кучи 1024. Измените его на 512, тогда он должен работать.

user1740626
источник
2

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

Аджит К'сагар
источник
2

Просто поместите #символ перед org.gradle.jvmargs=-Xmx1536mв gradle.properties

 # org.gradle.jvmargs=-Xmx1536m
Г-жа Соня
источник
Не уверен, как это сработало, когда пробовал Kotlin-multiplatform на mac os! в любом случае спасибо!
Чинтан Сони
1

Я знаю, что немного опоздал, но вот мой ответ:

Я только что установил онлайн-версию Java от Oracle (а не автономную 64-битную).

После добавления переменной JAVA_HOME ENV все заработало!

Надеюсь, я смогу помочь :)

Ларс фон Брух
источник
0

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

Java HotSpot(TM) Client VM warning: ignoring option PermSize=32M; support was removed in 8.0
Java HotSpot(TM) Client VM warning: ignoring option MaxPermSize=128M; support was removed in 8.0

В моем случае программное обеспечение еще не поддерживало java 8 (скрипт использовал старые аргументы JVM), но по умолчанию у меня была java 8.

Матева
источник
0

Одна из причин этой проблемы - нехватка памяти для запуска Tomcat. Попробуйте удалить ненужное запущенное программное обеспечение из окон и перезапустите eclipse и tomcat.

Соорибабу
источник