Управление памятью процесса Java через переменные среды
Мне нужно запустить скрипт, который содержит вызов java
, Я не могу изменить этот скрипт (так как он должен быть запущен на разных машинах), но я могу изменить среду вокруг него.
Я могу запустить сценарий обтекания, если это поможет.
Моя основная проблема заключается в том, что Java-процесс завершается с:
Could not allocate metaspace: 1073741824 bytes
Предел виртуальной памяти составляет:
$ ulimit -v
2097152
Мне также может понадобиться это для работы javac
если это не так.
2 ответа
Вы можете уменьшить объем используемой Java-памяти, используя -Xmx
, но это должно быть вызвано в командной строке, которая вызывает Java. К счастью, есть псевдонимы. Это не то же самое, что непосредственное изменение переменных среды, поэтому в конечном итоге это может не решить вашу проблему.
Итак, вы пишете скрипт-обертку:
#!/bin/bash
alias java="java -Xmx120M"
alias javac="javac -J-Xmx120M"
shopt -s expand_aliases
source /path/to/the/original/script.sh
Таким образом, все призывы к java someoption Someclass
будет выглядеть java -Xmx120M someoption Someclass
,
Конечно, это работает только если нет -Xmx
уже присутствует в скрипте, который вызывает проблемный код Java. И это работает только в том случае, если вызываемый скрипт не вызывает другие скрипты после него.
Как это работает:
alias
заменяет одну команду другой.
shopt -s expand_aliases
включает функцию псевдонимов (но она сбрасывается при запуске нового скрипта)
source ...somescript.sh
загружает другой скрипт внутри этого скрипта, как будто он где один. Это предотвращает недостаток упомянутого выше магазина. Но только один слой глубиной.
Существует встроенный метод предоставления параметров java программам, в котором вы не можете указать сборку JVM (например, ваш случай, но также, если команда java происходит внутри двоичного файла) и ее вызывается JAVA_TOOL_OPTIONS
,
В вашем случае вы бы установили:
JAVA_TOOL_OPTIONS="-Xmx120M"
к вашей среде.