Не вдалося зарезервувати достатньо місця для купи об’єктів


277

Я отримую таке виняток неодноразово кожен раз, коли намагаюся запустити програму.

Під час ініціалізації VM сталася помилка

Не вдалося зарезервувати достатньо місця для купи об’єктів

Не вдалося створити віртуальну машину 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?
Erty Seidohl

19
Дякую .. Виявляється, занадто велика кількість також може бути проблемою і може дати таку ж помилку!
Дінеш Раджан

17
Хтось знайшов рішення, яке насправді працює 100% часу? Це рішення вирішує проблему тимчасово, але потім раптом повертається. У мене є 16 ГБ оперативної пам’яті, і я втомився від цього ш * т. У старі часи все було краще: [
Nilzor

6
Не працює для мене в Windows 8 з x86 або x64 Java.
AndrewSmiley

128

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

-Xms1536m -Xmx1536m

де це може / працювало б :

-Xms1336m -Xmx1336m

5
Я забув згадати, що ця проблема повинна виникнути під час запуску в 32-бітній командній оболонці. У 64-бітної оболонки команди може не виникнути цієї проблеми.
djangofan

Для мене це не вдалося зі значенням за замовчуванням і із занадто великим значенням, тому переконайтеся, що ви спробували кілька значень. Дякую за відповідь!
Тракс

47

ось як це виправити:

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

    Змінні-> Нове: Назва _JAVA_OPTIONS змінної: Значення -Xmx512M змінної: Назва Path
    змінної: Значення змінної:%PATH%;C:\Program Files\Java\jre6\bin;F:\JDK\bin;

Змініть це на відповідний шлях.


1
Досить схожий на цю відповідь , я б сказав ...
That1Guy

Хороший. Поряд із вищезгаданим зверніться і до цього. stackoverflow.com/a/9350506/967638
Amarnath

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-розрядним VM. На 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провалившись, навіть незважаючи на те, що зверху все ще було кілька вільних: | (також сказав, що сталася помилка під час ініціалізації VM. Неможливо іноді залишити достатньо місця для масиву маркування картки). Виправлення, здавалося, було запущено вгорі, шукайте, які процеси використовують найбільш оперативну пам’ять (стовпець VIRT), знищуйте їх [postgres, appdynamics for me]: |
rogerdpack

Це може бути пов'язано з фрагментацією пам'яті? У відповіді вище згадується суміжний вільний простір.
Рік Моріц

6

Помилка:

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

Першопричина :

  • Неправильне / недостатнє розподіл пам’яті для нашого JVM, як зазначено нижче.

  • напр. JAVA_OPTS = "- Xms1303m -Xmx1303m -XX: MaxPermSize = 256 м" в jboss-eap-6.2 \ bin \ standalone.conf або "JAVA_OPTS = -Xms1G -Xmx1G -XX: MaxPermSize = 256M" в jboss-ep-6 \ \ standalone.conf.bat - це не що інше, як параметри пулу розподілу пам'яті JVM.

Роздільна здатність:

  • Збільшити розмір купи. Щоб збільшити розмір купи,
  • goto -> jboss-eap-6.2 \ bin \ standalone.conf.bat або jboss-eap-6.2 \ bin \ standalone.conf
  • зміни -> JAVA_OPTS = "- Xms256m -Xmx512m -XX: MaxPermSize = 256 м", де -Xms - мінімальний розмір купи і -Xmx - максимальний розмір купи.
  • Зазвичай не рекомендується мати однаковий розмір для min та max.

  • Якщо ви запускаєте свою програму від затемнення,

  • Двічі клацніть на сервері
  • виберіть "відкрити конфігурацію запуску", ви будете перенаправлені до вікна "Редагувати властивості конфігурації запуску".
  • У цьому вікні перейдіть на вкладку '(x) = Аргументи'.
  • У аргументах VM визначте розмір вашої купки, як зазначено нижче
  • "-Dprogram.name = JBossTools: JBoss EAP 6.1+ Server Runtime" -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-бітний VM, помилки не було.



2

Якщо ви працюєте з 32-бітовим JVM, зміна розміру купи на меншу допоможе. Це можна зробити, передавши аргументи в java безпосередньо або через змінні середовища, як-от нижче,

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

Для 64-бітового JVM більший розмір купи, як і -Xms512M -Xmx1536Mповинен працювати.

Run java -versionабо java -d32, java--d64для Java7 , щоб перевірити , скільки разів ви працюєте.


1

У будь-якому випадку, ось як це виправити: Перейдіть до Пуск-> Панель управління-> Система-> Додатково (вкладка) -> Змінні середовища-> Змінні системи-> Нове: Назва змінної: _JAVA_OPTIONS Значення змінної: -Xmx512M

АБО

Змініть виклик мурашки, як показано нижче.

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

Це працювало для мене.


1

Під час ініціалізації VM сталася помилка. Не вдалося зарезервувати достатньо місця для купи об’єктів 1572864KB

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


1

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

Variable name: _JAVA_OPTIONS
Variable value: -Xmx512M

Цей параметр глобально обмежує розмір купи, який ви можете надати IntelliJ.
користувач3056052

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, змініть .sh файл відповідним чином.


0

Я отримав таку ж помилку, і її вирішили, коли я видалив темп-файли, використовуючи% temp% та перезапустивши затемнення.


0

Іноді це стосується як

$ sysctl vm.overcommit_memory
vm.overcommit_memory = 2

Якщо встановити його:

$ sysctl vm.overcommit_memory=0

Це має працювати.


0

Замініть -Xmx2Gна -Xms512Mабо більший об'єм пам'яті у файлі cassandra.bat у каталозі бін кассандри.


0

Відкрийте файл gradle.properties у папці Android.

Замініть цей рядок:

org.gradle.jvmargs=-Xmx1536M

з:

org.gradle.jvmargs=-Xmx512m

Пояснення: Максимальна межа з документа Gradle:

Якщо запитуване середовище збірки не визначає максимальний розмір купи, Daemon використовуватиме до 512 Мб кучі.


-2

Не потрібно нічого робити, а лише змініть файл POM, як показано нижче

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

2
Хто щось сказав про файл POM?
Henley Chiu
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.