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

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 не может зарезервировать достаточно места для кучи объектов . Мы также узнали, как контролировать ограничения размера кучи, чтобы уменьшить эту ошибку.

Затем узнайте больше о потенциальных проблемах с памятью во время выполнения и о том, как их идентифицировать.