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

1. Огляд

У цьому посібнику ми дізнаємося про причину помилки "Не вдалося зарезервувати достатньо місця для кучі об'єктів" , переглядаючи деякі можливі сценарії.

2. Симптоми

“Не вдалося зарезервувати достатньо місця для купи об’єктів” - це специфічна помилка JVM, яка виникає, коли процес Java не може створити віртуальну машину через обмеження пам’яті, що виникають у запущеній системі:

java -Xms4G -Xmx4G -jar HelloWorld.jar 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 з макс кучного граничного розміру параметра ( -Xmx ) і значення є більш ніж то , що процес може мати від операційної системи .

Обмеження розміру купи варіюється залежно від кількох обмежень:

  • апаратна архітектура (32/64 біт)
  • Бітова версія JVM (32/64 біт)
  • операційна система, яку ми використовуємо

По-друге, коли процес Java не може зарезервувати вказаний обсяг пам'яті через інші програми, що працюють в тій самій системі і споживають пам'ять.

3. Розмір купи

Простір купи Java - це пул розподілу пам'яті для виконання Java-програми, керованої самою JVM. За замовчуванням пул розподілу обмежений початковим та максимальним розміром. Щоб дізнатись більше про Heap Space на Java, подивіться цю статтю тут.

Давайте подивимося, який максимальний розмір купи в різних середовищах і як ми можемо встановити обмеження.

3.1. Максимальний розмір купи

Максимальний теоретичний ліміт купи для 32-розрядних та 64-розрядних JVM легко визначити, дивлячись на доступний простір пам'яті, 2 ^ 32 (4 ГБ) для 32-розрядних JVM та 2 ^ 64 (16 ексабайт) для 64- біт JVM.

На практиці через різні обмеження межа може бути набагато нижчою і варіюється залежно від операційної системи. Наприклад, у 32-розрядних системах Windows максимальний діапазон розміру купи становить від 1,4 ГБ до 1,6 ГБ . На відміну від цього, у 32-розрядних системах Linux максимальний розмір купи може досягати 3 ГБ.

З цієї причини, якщо додатку потрібна велика купа, ми повинні використовувати 64-розрядну JVM . Однак при великій купі у збирача сміття буде більше роботи, тому важливо знайти хороший баланс між розміром купи та продуктивністю.

3.2. Як контролювати обмеження розміру купи?

У нас є два варіанти управління обмеженнями розміру купи JVM.

По-перше, за допомогою параметрів командного рядка Java при кожній ініціалізації JVM:

-Xms Sets initial Java heap size. This value must be a multiple of 1024 and greater than 1 MB. -Xmx Sets maximum Java heap size. This value must be a multiple of 1024 and greater than 2 MB. -Xmn Sets the initial and maximum size (in bytes) of the heap for the young generation.

Для значення розміру ми можемо додати літеру k або K , m або M та g або G, щоб вказати кілобайти, мегабайти та гігабайти відповідно. Якщо буква не вказана, використовується одиниця за замовчуванням (байт).

-Xmn2g -Xmn2048m -Xmn2097152k -Xmn2147483648

По-друге, за допомогою змінної середовища JAVA_OPTS для глобального налаштування параметрів командного рядка Java. Завдяки цьому кожна ініціалізація JVM в системі автоматично використовуватиме конфігурації, встановлені у змінній середовища.

JAVA_OPTS="-Xms256m -Xmx512m"

Для отримання додаткової інформації перегляньте наш повний посібник з параметрів JVM.

4. Висновок

У цьому підручнику ми обговорили два можливі сценарії, коли JVM не може зарезервувати достатньо місця для купи об'єктів . Ми також дізналися, як контролювати обмеження розміру купи, щоб пом'якшити цю помилку.

Далі дізнайтеся більше про потенційні проблеми з пам’яттю під час виконання та про те, як їх ідентифікувати.