Исправлено: ошибка при инициализации виртуальной машины не могла зарезервировать достаточно места для кучи объекта.

Несмотря на то, что в наши дни Java-апплеты не являются популярной веб-технологией, существует бесчисленное множество причин для развертывания виртуальной машины Java непосредственно на сервере Linux. Если вы попытаетесь запустить команду Linux java напрямую либо на отдельном оборудовании, либо внутри собственной виртуальной машины, вы можете получить сообщение «Произошла ошибка во время инициализации виртуальной машины, не удалось зарезервировать достаточно места для кучи объектов».

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

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

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

Java и бесплатные команды

Обратите внимание, что на нашей тестовой машине у нас было около 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 в командной строке исправило эту проблему.