#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
Давайте разберем это:
- Параметры виртуальной машины Heroku по умолчанию для Java: -XX: UseContainerSupport -Xmx300m -Xss512k -XX:CICompilerCount=2 -Dfile.encoding=UTF-8
- Параметры Heroku для показателей времени выполнения: -javaagent:/app/.heroku/bin/heroku-metrics-agent.jar
- Мои собственные пользовательские параметры Java-инструмента: -Xmx150m -XX: MaxMetaspaceSize = 100m
- Параметры 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
- ОПЯТЬ ЖЕ, параметры виртуальной машины 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 по этому поводу я обнаружил, что работает следующий подход:
- Удалите все пользовательские настройки из JAVA_TOOL_OPTIONS
- Настройте все необходимые параметры 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