Параметры JVM Heroku по умолчанию дублируются в начале и конце параметров виртуальной машины

#heroku #jvm #jmx #jconsole

#heroku #jvm #jmx #jconsole

Вопрос:

Мое приложение spring boot работает с ужасной ошибкой памяти R14. Локально я могу нормально запускать свое приложение с помощью -Xmx150m, поэтому я хотел переопределить конфигурацию Heroku по умолчанию -Xmx300m, используя JAVA_TOOL_OPTIONS .

В окне параметров инструмента Heroku я установил JAVA_TOOL_OPTIONS равным: -Xmx150m -XX:MaxMetaspaceSize = 100m

Чтобы отслеживать использование памяти в пользовательском интерфейсе Heroku, я также включил https://devcenter.heroku.com/articles/language-runtime-metrics-jvm , который, как я понимаю, также изменяет аргументы виртуальной машины.

Чтобы иметь возможность использовать jconsole, я включил Java-плагин Heroku CLI: https://devcenter.heroku.com/articles/exec#using-java-debugging-tools

Тем не менее, я сталкиваюсь с ошибками R14, и похоже, что мое определение -Xmx150m не вступает в силу.

Используя jconsole, я мог видеть, что фактически используемые аргументы виртуальной машины следующие:

Аргументы виртуальной машины: -XX: UseContainerSupport -Xmx300m -Xss512k -XX:CICompilerCount=2 -Dfile.encoding=UTF-8 -javaagent:/app/.heroku/bin/heroku-metrics-agent.jar -Xmx150m -XX:максимальный размер пространства = 100 м -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1098 -Dcom.sun.management.jmxremote.rmi.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=true -Djava.rmi.server.hostname=172.17.39.70 -Djava.rmi.server.port=1099 -Dserver.port=36924 -XX: UseContainerSupport -Xmx300m -Xss512k -XX:CICompilerCount=2 -Dfile.encoding=UTF-8

Давайте разберем это:

  1. Параметры виртуальной машины Heroku по умолчанию для Java: -XX: UseContainerSupport -Xmx300m -Xss512k -XX:CICompilerCount=2 -Dfile.encoding=UTF-8
  2. Параметры Heroku для показателей времени выполнения: -javaagent:/app/.heroku/bin/heroku-metrics-agent.jar
  3. Мои собственные пользовательские параметры Java-инструмента: -Xmx150m -XX: MaxMetaspaceSize = 100m
  4. Параметры Heroku для CLI Java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1098 -Dcom.sun.management.jmxremote.rmi.port=1099 -Dcom.sun.management.jmxremote.ssl =false -Dcom.sun.management.jmxremote.аутентификация = false -Dcom.sun.management.jmxremote.local.only=true -Djava.rmi.server.hostname=172.17.39.70 -Djava.rmi.server.port= 1099 -Dserver.port= 36924
  5. ОПЯТЬ ЖЕ, параметры виртуальной машины Heroku по умолчанию??? -XX: UseContainerSupport -Xmx300m -Xss512k -XX:CICompilerCount=2 -Dfile.encoding=UTF-8

Теперь я попытался отключить метрики времени выполнения Heroku, и это показывает следующие аргументы виртуальной машины в jconsole:

XX: UseContainerSupport -Xmx300m -Xss512k -XX: CICompilerCount=2 -Dfile.encoding=UTF-8 -Xmx150m -XX:MaxMetaspaceSize= 100m -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1098 -Dcom.sun.management.jmxremote.rmi.порт = 1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=true -Djava.rmi.server.hostname=172.18.116.38 -Djava.rmi.server.port=1099 -Dserver.port=35883 -XX: UseContainerSupport -Xmx300m -Xss512k -XX:CICompilerCount=2 -Dfile.encoding=UTF-8

===> это отключило только номер 2 из списка выше.

Что, наконец, подводит меня к моему вопросу: как вы можете избежать добавления Heroku собственных параметров по умолчанию, как в начале, так и в конце списка опций???

Ответ №1:

После открытия запроса в службу поддержки Heroku по этому поводу я обнаружил, что работает следующий подход:

  1. Удалите все пользовательские настройки из JAVA_TOOL_OPTIONS
  2. Настройте все необходимые параметры jvm, включая параметры heroku по умолчанию, в JAVA_OPTS.

Теперь у меня есть java opts, установленные на -XX: UseContainerSupport -Xmx150m -Xss512k -XX:CICompilerCount=2 -Dfile.encoding=UTF-8, и это работает как шарм.

Я настроил это через https://dashboard.heroku.com/apps/<<name of your app>>/settings => Config Vars