Linux

Fix: Error occurred during initialization of VM could not reserve enough space for object heap

Несмотря на то, что Java-апплеты не являются популярной веб-технологией в наши дни, существует бесчисленное множество причин для развертывания виртуальной машины Java непосредственно на сервере Linux. Если вы попытаетесь запустить команду java в Linux либо на дискретном оборудовании, либо внутри собственной виртуальной машины, то вы можете получить сообщение “error occurred during initialization of VM could not reserve enough space for object heap”.

Это, вероятно, выглядит довольно странно, потому что у вас, скорее всего, достаточно оперативной памяти для выполнения команды, но это ’в основном из-за специфической причуды в том, как используются физические и виртуальные страницы памяти. Указание некоторых относительно больших размеров должно позволить вам полностью обойти это сообщение и запустить команду java так же, как и любую другую.

Метод 1: Использование параметров командной строки

Если вы’ пытались запустить java и получили это сообщение, то вы’ вероятно, уже выполнили команду free, чтобы убедиться, что в памяти достаточно места для запуска программы.

java & free commands

Обратите внимание, что на нашей тестовой машине у нас было несколько 2.3 ГБ физической оперативной памяти и ни одна страница виртуальной памяти еще не была использована. Если вы заметили, что у вас нехватка памяти, то вам’ захочется закрыть другие запущенные программы, прежде чем пытаться запустить их снова. С другой стороны, те, кто обнаружил, что у них много свободной памяти, могут попробовать указать размер напрямую.

Например, на нашей машине мы смогли выполнить команду java -Xms256m -Xmx512M, и она сработала так, как и ожидалось. Это ограничивает размер кучи, которую виртуальная машина Java пытается зарезервировать при запуске. Поскольку неограниченная виртуальная машина гипотетически может делать необычные вещи, она может выдавать сообщения об ошибках на свободной системе. Вы также можете поиграть с этими двумя значениями, пока не найдете правильную комбинацию.

Это может быть проблемой независимо от того, на какой машине вы ее запускаете, поскольку JVM не имеет ничего общего с типом виртуальной машины, которую вы используете для запуска GNU/Linux.

Метод 2: Экспорт переменных, чтобы сделать изменения постоянными

Когда вы найдете подходящее значение, вы можете экспортировать его, чтобы сделать постоянным для этой сессии. Например, мы использовали export _JAVA_OPTIONS=’-Xms256M -Xmx512M’ из командной строки bash, и это позволило нам запускать команду java самостоятельно без каких-либо других опций, пока мы не вышли из нашего сервера.

Ее нужно было запускать снова, когда мы входили в очередную сессию, поэтому, если вы планируете часто использовать команду java, вам стоит добавить ее в соответствующие сценарии запуска. Мы добавили эту строку в наш .файл bash_login, и он, казалось, работал каждый раз, когда мы использовали приглашение для входа, без необходимости запускать его снова, хотя вам, возможно, придется найти другое место для него, если вы’ работаете с другой оболочкой.

Вы могли заметить, что только определенные конфигурации оборудования вызывают это сообщение об ошибке. Это происходит на машинах с большим объемом физической оперативной памяти, но с меньшими ограничениями на ее использование. Java попытается выделить огромный блок, но получит сообщение, что не может этого сделать, что интерпретируется как нехватка памяти.

Метод 3: Печать текущих параметров Java

Если вы’ работали в командной строке и хотите быстро получить информацию о том, что вы’ установили в значение _JAVA_OPTIONS, то просто выполните команду echo $_JAVA_OPTIONS, и она немедленно выведет текущие значения. Это полезно для устранения неполадок, когда вы’ пытаетесь определить правильные цифры, чтобы попробовать.

Имейте в виду, что хотя это исправление не должно потребовать никаких других действий, Java выдаст сообщение “не удалось зарезервировать достаточно места для кучи объектов”, если вы когда-нибудь обнаружите, что у вас действительно не хватает виртуальной памяти. Если это так, то вам необходимо проверить, какие процессы запущены в данный момент, и, возможно, перезапустить сервер, если это возможно. Вы также можете создать больше пространства подкачки, но если это проблема, то, как правило, лучше попытаться решить ее другим способом.

В редких случаях, когда настройки вроде бы правильные, но все равно не работают, убедитесь, что вы установили 64-битный пакет Java, поскольку он должен быть защищен от этой проблемы. Требования к объему памяти применимы только к 32-битной версии Java. В нескольких случаях 64-битная версия пыталась создать 32-битную виртуальную машину, поэтому указание опции -d64 в командной строке помогло нам решить эту проблему.

Добавить комментарий