Подтвердить что ты не робот

Ограничение 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

БР,

Рене

4b9b3361

Ответ 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.