Ограничение Java Heap Space для игровой среды globaly
У меня есть очень старая Linux-система и установлена java и play framework. Когда я запускаю java, я получаю:
java -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
Итак, я ограничил пространство кучи java в application.conf:
jvm.memory=-Xmx256M -Xms256M
С помощью этой настройки я могу запустить тестовый тест, запустить проигрывание и т.д....
Но я не могу запустить:
play dependencies
~ _ _
~ _ __ | | __ _ _ _| |
~ | '_ \| |/ _' | || |_|
~ | __/|_|\____|\__ (_)
~ |_| |__/
~
~ play! 1.2.1, http://www.playframework.org
~
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
Есть ли глобальный файл конфигурации или переменная среды, где я могу ограничить java-пространство кучи глобальным для платформы воспроизведения?
Update:
Также не работает следующее:
play dependencies -Xmx256M -Xms256M
~ _ _
~ _ __ | | __ _ _ _| |
~ | '_ \| |/ _' | || |_|
~ | __/|_|\____|\__ (_)
~ |_| |__/
~
~ play! 1.2.1, http://www.playframework.org
~
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
Обновление 2:
Память:
ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
pending signals (-i) 1024
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 38912
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
Ограничения:
cat /proc/meminfo
MemTotal: 4139312 kB
MemFree: 332988 kB
Buffers: 105252 kB
Cached: 1705644 kB
SwapCached: 4 kB
Active: 2566216 kB
Inactive: 625032 kB
HighTotal: 786432 kB
HighFree: 1728 kB
LowTotal: 3352880 kB
LowFree: 331260 kB
SwapTotal: 4192956 kB
SwapFree: 4168224 kB
Dirty: 368 kB
Writeback: 0 kB
Mapped: 1672180 kB
Slab: 570864 kB
CommitLimit: 6262612 kB
Committed_AS: 4075144 kB
PageTables: 19884 kB
VmallocTotal: 303096 kB
VmallocUsed: 10400 kB
VmallocChunk: 292648 kB
БР,
Рене
Ответы
Ответ 1
После многопользовательской игры я нашел эту дискуссию. Проблема в том, что моя Linux-система работает в контейнере openvz:
Причина, по которой Java жалуется, заключается в том, что при запуске он видит, что на компьютере больше 2 ГБ ОЗУ, поэтому он запускается в режиме сервера, который пытается выделить всю память, которая затем терпит неудачу, потому что она внутри VPS.
Я мог бы исправить проблему запуска java, изменив /usr/java/jdk 1.6.0_26/jre/lib/i386/jvm.cfg:
-client IF_SERVER_CLASS -server
-server KNOWN
-hotspot ALIASED_TO -client
-classic WARN
-native ERROR
-green ERROR
в
#-client IF_SERVER_CLASS -server
-client KNOWN
-server KNOWN
-hotspot ALIASED_TO -client
-classic WARN
-native ERROR
-green ERROR
Теперь я могу запустить любую команду воспроизведения. Возможно, это помогает другим людям, имеющим схожие проблемы, связанные с виртуализацией на основе контейнеров.
БР, Рене
Ответ 2
Воспроизведение не отображает настройки jvm.memory для зависимостей или даже команды проверки. Один из способов заставить его использовать определенные настройки JVM - это использовать _JAVA_OPTIONS.
Например:
export _JAVA_OPTIONS="-Xms800m -Xmx1500m -XX:PermSize=64m -XX:MaxPermSize=256m"
play test
или
play deps
и вы должны увидеть
~ _ _
~ _ __ | | __ _ _ _| |
~ | '_ \| |/ _' | || |_|
~ | __/|_|\____|\__ (_)
~ |_| |__/
~
~ play! 1.2.3, http://www.playframework.org
~ framework ID is test
~
~ Running in test mode
~ Ctrl+C to stop
~
Picked up _JAVA_OPTIONS: -Xms800m -Xmx1500m -XX:PermSize=64m -XX:MaxPermSize=256m
Listening for transport dt_socket at address: 8000
Обратите внимание, что это применит эти настройки ко всем java-программам, запущенным на этом терминале, где установлено _JAVA_OPTIONS.
Ответ 3
Обычно вы можете указать аргументы командной строки Java, когда вы вызываете игру, используя следующий шаблон.
play run <appname> -Xmx256M -Xms256M
Однако, глядя на код python для команды play run
и команды play dependencies
, они вызывают Java по-разному.
Команда зависимостей воспроизведения вызывает Java без прохождения через -X команд (по какой-то причине она проходит через команды -D, но не -X). Поэтому вы ничего не можете сделать, кроме редактирования файла deps.py
в фреймворке /pym/play/commands и жесткого кодирования настроек -Xmx и -Xms в этот файл.
Это не долгосрочное решение, и я предлагаю вам поднять билет в Play, чтобы эти параметры можно было читать из командной строки или из приложения .conf, но пока я рассматриваю этот подход как единственный вариант.
Ответ 4
Просто наткнулся на это на моем ноутбуке, работающем на Fedora, и используя Play 2.0, просто запустив интерактивную оболочку. Я обнаружил, что build script устанавливает значения памяти по умолчанию довольно высокими значениями.
Чтобы исправить это, мне пришлось отредактировать $play_dir/framework/build
script и изменить значения вручную, в конце script он запускает следующее:
java ${DEBUG_PARAM} -Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=384M ...
Просто измените значения -Xmx/-Xms (и, возможно, permgen) соответственно.
Ответ 5
У вас недостаточно оперативной памяти для запуска Java. Java требуется как минимум 64 МБ оперативной памяти.
Обратите внимание, что вы не можете добавить свободную память на свой компьютер, указав -Xms
на Java: Java не может добавить модули памяти на вашу материнскую плату. -Xms
просто сообщает Java, сколько из имеющейся RAM. Если это не сработает (= ОС возвращает ошибку, когда Java пытается ее выделить), вы получите ошибку выше.
Я предполагаю, что нет места подкачки. Посмотрите на вывод cat /proc/meminfo
. Или у вас есть набор ulimit
, который ограничивает количество памяти, которую может выделить каждый процесс (попробуйте ulimit -a
для проверки).
Ответ 6
В Play 2.2 и Java 7 это то, что я использовал.
$ target/universal/stage/bin/foo -mem 256 -J-server
Подробную информацию о -mem см. в разделе
$ target/universal/stage/bin/foo -h
Ответ 7
Похоже, что команда play
, которую вы запускаете, на самом деле представляет собой Python script, который вызывает другие модули python для платформы Play Framework, которые в конечном итоге вызывают команду java
как подпроцесс.
Рассматривая исходный код для кода, который работает для команды dependencies
, не существует никакой логики для загрузки переменную окружения или что-либо еще, чтобы указать максимальный размер кучи в качестве аргумента -Xmx
. Другими словами, код Python из Play, который вызывает JVM в этом script, не имеет возможности указать максимальный размер кучи по умолчанию.
Ответ 8
Я столкнулся с той же проблемой. Попробуйте увеличить --XX: MaxHeapSize до более высокого уровня. Вот моя конфигурация в пути/в/framework/build
java -Xms512M -Xmx1300M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=384M -XX:MaxHeapSize=512m...
Ответ 9
Play не распознает опции -XX. Вместо этого используйте -DX.