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 не може зарезервувати достатньо місця для купи об'єктів . Ми також дізналися, як контролювати обмеження розміру купи, щоб пом'якшити цю помилку.
Далі дізнайтеся більше про потенційні проблеми з пам’яттю під час виконання та про те, як їх ідентифікувати.