2010-02-07

7 наиболее распространенных ошибок при установке ограничений памяти Java

Оригинал: "6 Common Errors in Setting Java Heap Size" (кажется, автор несколько ошибся в подсчетах)
Перевод: Владимир Русинов

Для установки размера кучи java (heap) используются две опции: -Xmx для установки максимального размера и -Xms для начального(минимального) размера. Вот наиболее часто встречающиеся ошибки их использования:

1. Отсутствие m, M, g или G в конце (регистр не имеет значения). Например:

java -Xmx128 BigApp
java.lang.OutOfMemoryError: Java heap space

Правильная команда должна быть такой:
java -Xmx128m BigApp
. Строго говоря, -Xmx128 корректная настройка для очень маленьких приложений (например HelloWorld), но я думаю в большинстве случаев все-таки имелось в виду -Xmx128m.


2. Лишний пробел или использование =. Например:

java -Xmx 128m BigApp
Invalid maximum heap size: -Xmx
Could not create the Java virtual machine.

java -Xmx=512m HelloWorld
Invalid maximum heap size: -Xmx=512m
Could not create the Java virtual machine.

Правильная команда должна иметь вид
java -Xmx128m BigApp
, без пробела или знака =. -X опции ведут себя отлично от -Dключ=значение опций, в которых используется =.

3. Установка только -Xms в значение большее чем максимальный размер кучи по умолчанию (64m). Похоже что минимальный размер кучи по умолчанию равен 0.
Пример:
java -Xms128m BigApp
Error occurred during initialization of VM
Incompatible initial and maximum heap sizes specified

Корректная команда должна выглядеть так:
java -Xms128m -Xmx128m BigApp
. Установить минимальный и максимальный размер равными - хорошая идея. В любом случае, минимальное значение не должно превышать максимальное.

4. Установка размера кучи большего чем объем доступной физической памяти. Пример:
java -Xmx2g BigApp
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

Устанавливайте размер кучи меньше чем размер физической памяти:
java -Xmx1g BigApp

5. Использование mb в качестве единицы измерения, вместо m или M.
java -Xms256mb -Xmx256mb BigApp
Invalid initial heap size: -Xms256mb
Could not create the Java virtual machine.

6. Установка размера кучи в большее значение, чем позволяет JVM. Пример:
java -Xmx256g BigApp
Invalid maximum heap size: -Xmx256g
The specified size exceeds the maximum representable size.
Could not create the Java virtual machine.

Укажите размер поменьше:
java -Xmx256m BigApp

7. Указание дробного чиста в качестве значения. Пример:
java -Xmx0.9g BigApp
Invalid maximum heap size: -Xmx0.9g
Could not create the Java virtual machine.

Правильная команда должна выглядеть так:
java -Xmx928m BigApp

PS:

Как установить размер кучи(heap) в Tomcat?

Остановите сервер Tomcat, установите переменную окружения CATALINA_OPTS, затем запустите Tomcat снова. Смотрите файлы tomcat-install/bin/catalina.sh или catalina.bat чтобы узнать как используется эта переменная окружения.

Примеры:
set CATALINA_OPTS=-Xms512m -Xmx512m
(Windows, значение не в кавычках)
export CATALINA_OPTS="-Xms512m -Xmx512m"
(ksh/bash, значение в кавычках)
setenv CATALINA_OPTS "-Xms512m -Xmx512m"
(tcsh/csh, значение в кавычках)

Просмотрев catalina.bat или catallina.sh, вы можете заметить что для установки JVM опций использутся CATALINA_OPTS, JAVA_OPTS или и то и другое. В чем же различие между CATALINA_OPTS и JAVA_OPTS? Имя CATALINA_OPTS специфично именно для Tomcat, а JAVA_OPTS может использоваться и в других java приложениях (например Jboss). Так как переменные окружения как правило устанавливаются глобально, Вы можете использовать это CATALINA_OPTS задания опций для Tomcat, и JAVA_OPTS - для опций других приложений.
Я предпочитаю использовать CATALINA_OPTS.

Как установить размер кучи в JBoss?

Остановите Jboss, отредактируйте значения в файле $JBOSS_HOME/bin/run.conf, запустите сервер. Вы можете изменить (или добавить если ее там нет) значение переменной JAVA_OPTS например на такое: JAVA_OPTS="-server -Xms128m -Xmx128m"

Как установить размер кучи в Eclipse?

Запускайте Eclispe с ключем "-vmargs <ваши опции>". Все опции после -vmargs будут интерпретированы как опции JVM.
Пример:
eclipse -vmargs -Xms64m -Xmx256m

Это установит опции для Eclipse, но не для приложения которое Вы разрабатываете в eclipse. Для того чтобы поменять опции приложения, используйте Run As -> Open Run Dialog -> (x)=Arguments -> VM Arguments

Как установить размер кучи в NetBeans?

Закройте NetBeans, отредактируйте файл netbeans-install/etc/netbeans.conf. Пример:
netbeans_default_options="-J-Xms512m -J-Xmx512m -J-XX:PermSize=32m -J-XX:MaxPermSize=128m -J-Xverify:none

Как установить размер кучи в Apache Ant?

Установите переменную окружения ANT_OPTS. Примеры:
set ANT_OPTS=-Xms512m -Xmx512m
(Windows)
export ANT_OPTS="-Xms512m -Xmx512m"
(ksh/bash)
setenv ANT_OPTS "-Xms512m -Xmx512m"
(tcsh/csh)

Как установить размер кучи в JavaEE SDK/J2EE SDK/Glassfish/Sun Java System Application Server?

Остановите сервер приложений, откройте $GLASSFISH_HOME/domains/domain1/config/domain.xml, найдите там XML элемент с именем java-config -> jvm-options. Пример:

  -Xmx512m
  -XX:NewRatio=2
  -XX:MaxPermSize=128m
  ...


Также вы можете изменять опции через веб-интерфейс администратора, обычно http://localhost:4848/, или https://localhost:4848/. Откройте Application Server в верхней части левой панели, затем на правой панели откройте JVM Settings -> JVM Options, и Вы увидите список текущих опций. Вы можете добавить новые или изменить существующие.

Еще один способ - использование cli комманды. Смотрите справку:
./asadmin help create-jvm-options
./asadmin help delete-jvm-options