Docker, Spring Boot and JAVA_OPTS
While adjusting some environment variables recently, I came across an odd issue with Docker, Spring Boot and JAVA_OPTS. JAVA_OPTS comes from the Tomcat/Catalina world and when searching for “Docker and javaopts” on Google you’ll find many references to just adding JAVA_OPTS to the Docker environment. After some testing, I found this to be incorrect when running a Spring Boot jar in a Docker container, I’ll explain why and give a solution in this post.
Before I start, let’s setup a basic test environment that prints out the current memory setup so we can test in various situations. I’ve created this repo as a test case and you can refer back to it when needed.
Test Application Setup
Looking at the sample code, we have a basic pom file that imports Spring Boot dependencies:
Looking at the sample code, we have a basic pom file that imports Spring Boot dependencies:
The main application is a single Java file that prints out memory details:
Running this app in IntelliJ with no memory settings will show some basic output with memory settings:
Changing the memory values to -Xmx3g -Xms3g we get a different output:
Now that we have a baseline, let’s move onto the Docker stage.
Docker
The first thing we’ll do is setup a basic Dockerfile similar to the one in the Spring Boot guide. Since the jar will be built in the target folder we grab it from there and place a renamed copy into the container.
To generate the jar, just run maven real quick.
The jar will then be in the target folder ready for building the Docker container.
With the jar and the Dockerfile ready we can build the container from the base folder of the repository.
We can see the newly built image by listing our Docker images.
With our newly built container that will run Spring boot application let’s run it for the first time! Note: I’ll be cutting out some of the output lines to save space since we only care about the memory detail output.
First run looks good. Let’s try setting the JAVA_OPTS as we’re used to!
Woah! The Xmx and Xms settings didn’t have any affect on the Java settings in the container! Something must be wrong here and it’s not immediately obvious if all you search for is for “Docker and javaopts” on Google. Spring Boot is smart enough to handle many passed in environment variables but those are application specific. For example, when you look for a value x.y.z, Spring Boot will look in application.properties by default for x.y.z and in the environment variables for X_Y_Z. Due to this, passing in the environment variable -e X_Y_Z=1234 can be used in your application when using a Docker container. However, since JAVA_OPTS are used by Java and not in the application we run into this problem.
After some searching, I came across the fact that JAVA_OPTS are very specific to Catalina (Tomcat). Looking in the bin folder of a tomcat install you’ll find a shell script that handles passing JAVA_OPTS into the exec lines. With this info, we can now look to change the Dockerfile to adjust for handling passed in environment variables. I named this new Dockerfile ExecDockerfile] so I can have both in the same repo.
The change needed to enable JAVA_OPTS is to execute the Java line with an ENTRYPOINT exec command and place the environment variable into the line.
Let’s rebuild the container but specify the new ExecDockerfile specifically using the -f flag.
Let’s run the container again.
Conclusion
By starting the jar with ENTRYPOINT exec java $JAVA_OPTS, we’ve successfully enabled changing memory settings using Docker environment variables. If you think you’re changing the memory settings currently but are not passing in $JAVA_OPTS into your start line in some fashion, I suggest you look at your Dockerfile config.
Originally published at c4.vc on December 23, 2015.
JAVA_OPTS Environment Variable
JAVA_OPTS is an environment variable used to pass custom settings to Java Virtual Machine. This tutorial demonstrates the use of JAVA_OPTS .
JAVA_OPTS Environment Variable
JAVA_OPTS is a standard environment variable used to set the custom setting for Java Virtual Machine. For example, if we set JAVA_OPTS=-Xmx512m in the tomcat, the startup script will execute org.apache.tomcat.Servert –Xmx512m , the –Xmx is the maximum heap size.
Set JAVA_OPTS Environment Variable
We can set the heap size with JAVA_OPTS using the Set command. Run the following command to set the heap size with JAVA_OPTS .
Where -Xms is the minimum heap size and -Xmx is the maximum heap size.
Run the command prompt as administrator and run the command above. You can also set the heap size according to your requirement.
Get JAVA_OPTS Environment Variable in Java
Once the JAVA_OPTS is set, we can get the settings in Java by using the System.getenv() method. If the JAVA_OPTS is not set, the method will return null .
The code above will get the JAVA_OPTS settings. See output:
Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.
How do I use the JAVA_OPTS environment variable?
How do I use the JAVA_OPTS variable to configure a web server (a linux server)?
How can I set -Djava.awt.headless=true using JAVA_OPTS ?
6 Answers 6
JAVA_OPTS is the standard environment variable that some servers and other java apps append to the call that executes the java command.
For example in tomcat if you define JAVA_OPTS=’-Xmx1024m’ , the startup script will execute java org.apache.tomcat.Servert -Xmx1024m
If you are running in Linux/OSX, you can set the JAVA_OPTS, right before you call the startup script by doing
This will only last as long as the console is open. To make it more permanent you can add it to your
Русские Блоги
Оптимизация памяти Tomcat 2 Описание параметров Tomcat
1. Оптимизация памяти Tomcat
T Оптимизация памяти omcat предназначена главным образом для оптимизации параметров запуска tomcat. Мы можем установить параметр JAVA_OPTS в сценарии запуска tomcat catalina.sh.
1. Описание параметра JAVA_OPTS
- -сервер включает серверную версию jdk;
- -Минимальная память при инициализации виртуальной машины Xmsjava;
- -Максимальный объем памяти, доступный для виртуальной машины Xmxjava;
- -XX: постоянная область памяти PermSize
- -XX: максимальная постоянная зарезервированная область памяти MaxPermSize
Настройка параметров сервера 
Серверная память компании обычно может быть добавлена максимум до 2G, поэтому вы можете использовать следующую конфигурацию:
- JAVA_OPTS= ‘-Xms1024m-Xmx2048m-XX:PermSize=256M-XX:MaxNewSize=256m-XX:MaxPermSize=256m’
После завершения настройки вы можете перезапустить Tomcat и использовать следующую команду, чтобы проверить, действует ли конфигурация:
1. Сначала проверьте номер процесса Tomcat:
- sudolsof-i:9027

Мы видим, что номер процесса Tomcat — 12222.
1. Проверьте, вступает ли в силу конфигурация:
- sudojmap–heap12222

Мы видим, что MaxHeapSize и другие параметры вступили в силу. ,
2. Оптимизация параллелизма Tomcat
1. Параметры подключения Tomcat
В конфигурации <Connector . /> в файле конфигурации Tomcat server.xml
1. Описание параметров
minProcessors: минимальное количество незанятых потоков соединений, используемых для повышения производительности системной обработки, значение по умолчанию 10
maxProcessors: максимальное количество потоков соединений, то есть максимальное количество одновременно обрабатываемых запросов, значение по умолчанию — 75
acceptCount: максимально допустимое количество соединений, должно быть больше или равно maxProcessors, значение по умолчанию равно 100
enableLookups: для обратной проверки доменного имени, значение: true или false. Чтобы улучшить вычислительную мощность, следует установить значение false
connectionTimeout: время ожидания сетевого соединения, единица измерения: миллисекунды. Значение 0 означает, что время ожидания никогда не истекает, этот параметр имеет скрытые опасности. Обычно может быть установлено 30000 миллисекунд.
Параметры, относящиеся к максимальному количеству соединений: maxProcessors и acceptCount. Если вы хотите увеличить количество одновременных подключений, вы должны увеличить оба параметра.
Максимальное количество подключений, разрешенных веб-сервером, также зависит от параметров ядра операционной системы, обычно Windows составляет около 2000, Linux — около 1000.
2. Пример конфигурации в Tomcat
- <Connector port = "9027"
- protocol = "HTTP/1.1"
- maxHttpHeaderSize = "8192"
- minProcessors = "100"
- maxProcessors = "1000"
- acceptCount = "1000"
- redirectPort = "8443"
- disableUploadTimeout = "true" />
2. Отрегулируйте параллельную обработку разъема
1. Описание параметров
maxThreads Максимальное количество клиентских запросов
minSpareThreadsNumber потоков сокетов, созданных при инициализации Tomcat
maxSpareThreadsМаксимальное количество потоков незанятых сокетов для коннектора Tomcat
enableLookups Если установлено значение true, разрешение имен доменов поддерживается, и IP-адреса могут быть преобразованы в имена хостов.
redirectPort Когда требуется безопасный сценарий на основе канала, перенаправляйте клиентские запросы на redirectPort на основе SSL
acceptAccount Максимальное количество очередей прослушивающих портов. После заполнения клиентский запрос будет отклонен (не может быть меньше maxSpareThreads)
connectionTimeout тайм-аут соединения
Минимальное количество потоков обработки при создании сервера minProcessors
Максимальный поток одновременной обработки на сервере maxProcessors
URIEncoding Унифицированная кодировка URL
2. Пример конфигурации в Tomcat
- <Connector port = "9027"
- protocol = "HTTP/1.1"
- maxHttpHeaderSize = "8192"
- maxThreads = "1000"
- minSpareThreads = "100"
- maxSpareThreads = "1000"
- minProcessors = "100"
- maxProcessors = "1000"
- enableLookups = "false"
- URIEncoding = "utf-8"
- acceptCount = "1000"
- redirectPort = "8443"
- disableUploadTimeout = "true" />
3. Оптимизация кэша Tomcat
1. Описание параметров
c ompression Включить компрессию
compressionMinSize Размер содержимого вывода с включенным сжатием, по умолчанию 2 КБ
compressableMimeType Тип сжатия
connectionTimeout Определите время для установления тайм-аута клиентского соединения. Если оно равно -1, это означает, что время для установления клиентского соединения не ограничено
2. Пример конфигурации в Tomcat
- <Connector port = "9027"
- protocol = "HTTP/1.1"
- maxHttpHeaderSize = "8192"
- maxThreads = "1000"
- minSpareThreads = "100"
- maxSpareThreads = "1000"
- minProcessors = "100"
- maxProcessors = "1000"
- enableLookups = "false"
- compression = "on"
- compressionMinSize = "2048"
- compressableMimeType = "text/html,text/xml,text/javascript,text/css,text/plain"
- connectionTimeout = "20000"
- URIEncoding = "utf-8"
- acceptCount = "1000"
- redirectPort = "8443"
- disableUploadTimeout = "true" />
4. Эталонная конфигурация
1. Старая конфигурация
Сервер был настроен следующим образом со ссылкой на сеть. Извлеките его и поделитесь им:
- <Connector port = "9027"
- protocol = "HTTP/1.1"
- maxHttpHeaderSize = "8192"
- maxThreads = "1000"
- minSpareThreads = "25"
- maxSpareThreads = "75"
- enableLookups = "false"
- compression = "on"
- compressionMinSize = "2048"
- compressableMimeType = "text/html,text/xml,text/javascript,text/css,text/plain"
- connectionTimeout = "20000"
- URIEncoding = "utf-8"
- acceptCount = "200"
- redirectPort = "8443"
- disableUploadTimeout = "true" />
Позже было обнаружено, что узкие места в работе возникали, когда число посещений достигало более 3 миллионов.
2. Измененная конфигурация
- <Connector port = "9027"
- protocol = "HTTP/1.1"
- maxHttpHeaderSize = "8192"
- maxThreads = "1000"
- minSpareThreads = "100"
- maxSpareThreads = "1000"
- minProcessors = "100"
- maxProcessors = "1000"
- enableLookups = "false"
- compression = "on"
- compressionMinSize = "2048"
- compressableMimeType = "text/html,text/xml,text/javascript,text/css,text/plain"
- connectionTimeout = "20000"
- URIEncoding = "utf-8"
- acceptCount = "1000"
- redirectPort = "8443"
- disableUploadTimeout = "true" />
1. Оптимизация памяти Tomcat
T Оптимизация памяти omcat в основном для оптимизации параметров запуска tomcat. Мы можем установить параметр JAVA_OPTS в сценарии запуска tomcat catalina.sh
1. Описание параметра JAVA_OPTS
- -сервер включает серверную версию jdk;
- -Минимальная память при инициализации виртуальной машины Xmsjava;
- -Максимальный объем памяти, доступный для виртуальной машины Xmxjava;
- -XX: постоянная область памяти PermSize
- -XX: максимальная постоянная зарезервированная область памяти MaxPermSize
Настройка параметров сервера 
Серверная память компании обычно может быть добавлена максимум до 2G, поэтому вы можете использовать следующую конфигурацию:
- JAVA_OPTS= ‘-Xms1024m-Xmx2048m-XX:PermSize=256M-XX:MaxNewSize=256m-XX:MaxPermSize=256m’
После завершения настройки вы можете перезапустить Tomcat и использовать следующую команду, чтобы проверить, действует ли конфигурация:
1. Сначала проверьте номер процесса Tomcat:
- sudolsof-i:9027

Мы видим, что номер процесса Tomcat — 12222.
1. Проверьте, вступает ли в силу конфигурация:
- sudojmap–heap12222

Мы видим, что MaxHeapSize и другие параметры вступили в силу. ,
2. Оптимизация параллелизма Tomcat
1. Параметры подключения Tomcat
В конфигурации <Connector . /> в файле конфигурации Tomcat server.xml
1. Описание параметров
minProcessors: минимальное количество незанятых потоков соединений, используемых для повышения производительности системной обработки, значение по умолчанию 10
maxProcessors: максимальное количество потоков соединений, то есть максимальное количество одновременно обрабатываемых запросов, значение по умолчанию — 75
acceptCount: максимально допустимое количество соединений, должно быть больше или равно maxProcessors, значение по умолчанию равно 100
enableLookups: для обратной проверки доменного имени, значение: true или false. Чтобы улучшить вычислительную мощность, следует установить значение false
connectionTimeout: время ожидания сетевого соединения, единица измерения: миллисекунды. Значение 0 означает, что время ожидания никогда не истекает, этот параметр имеет скрытые опасности. Обычно может быть установлено 30000 миллисекунд.
Параметры, относящиеся к максимальному количеству соединений: maxProcessors и acceptCount. Если вы хотите увеличить количество одновременных подключений, вы должны увеличить оба параметра.
Максимальное количество подключений, разрешенных веб-сервером, также зависит от параметров ядра операционной системы, обычно Windows составляет около 2000, Linux — около 1000.
2. Пример конфигурации в Tomcat
- <Connector port = "9027"
- protocol = "HTTP/1.1"
- maxHttpHeaderSize = "8192"
- minProcessors = "100"
- maxProcessors = "1000"
- acceptCount = "1000"
- redirectPort = "8443"
- disableUploadTimeout = "true" />
2. Отрегулируйте параллельную обработку разъема
1. Описание параметров
maxThreads Максимальное количество клиентских запросов
minSpareThreadsNumber потоков сокетов, созданных при инициализации Tomcat
maxSpareThreadsМаксимальное количество потоков незанятых сокетов для коннектора Tomcat
enableLookups Если установлено значение true, разрешение имен доменов поддерживается, и IP-адреса могут быть преобразованы в имена хостов.
redirectPort Когда требуется безопасный сценарий на основе канала, перенаправляйте клиентские запросы на redirectPort на основе SSL
acceptAccount Максимальное количество очередей прослушивающих портов. После заполнения клиентский запрос будет отклонен (не может быть меньше maxSpareThreads)
connectionTimeout тайм-аут соединения
Минимальное количество потоков обработки при создании сервера minProcessors
Максимальный поток одновременной обработки на сервере maxProcessors
URIEncoding Унифицированная кодировка URL
2. Пример конфигурации в Tomcat
- <Connector port = "9027"
- protocol = "HTTP/1.1"
- maxHttpHeaderSize = "8192"
- maxThreads = "1000"
- minSpareThreads = "100"
- maxSpareThreads = "1000"
- minProcessors = "100"
- maxProcessors = "1000"
- enableLookups = "false"
- URIEncoding = "utf-8"
- acceptCount = "1000"
- redirectPort = "8443"
- disableUploadTimeout = "true" />
3. Оптимизация кэша Tomcat
1. Описание параметров
c ompression Включить компрессию
compressionMinSize Размер содержимого вывода с включенным сжатием, по умолчанию 2 КБ
compressableMimeType Тип сжатия
connectionTimeout Определите время для установления тайм-аута клиентского соединения. Если оно равно -1, это означает, что время для установления клиентского соединения не ограничено
2. Пример конфигурации в Tomcat
- <Connector port = "9027"
- protocol = "HTTP/1.1"
- maxHttpHeaderSize = "8192"
- maxThreads = "1000"
- minSpareThreads = "100"
- maxSpareThreads = "1000"
- minProcessors = "100"
- maxProcessors = "1000"
- enableLookups = "false"
- compression = "on"
- compressionMinSize = "2048"
- compressableMimeType = "text/html,text/xml,text/javascript,text/css,text/plain"
- connectionTimeout = "20000"
- URIEncoding = "utf-8"
- acceptCount = "1000"
- redirectPort = "8443"
- disableUploadTimeout = "true" />
4. Эталонная конфигурация
1. Старая конфигурация
Сервер был настроен следующим образом со ссылкой на сеть. Извлеките его и поделитесь им:
- <Connector port = "9027"
- protocol = "HTTP/1.1"
- maxHttpHeaderSize = "8192"
- maxThreads = "1000"
- minSpareThreads = "25"
- maxSpareThreads = "75"
- enableLookups = "false"
- compression = "on"
- compressionMinSize = "2048"
- compressableMimeType = "text/html,text/xml,text/javascript,text/css,text/plain"
- connectionTimeout = "20000"
- URIEncoding = "utf-8"
- acceptCount = "200"
- redirectPort = "8443"
- disableUploadTimeout = "true" />
Позже было обнаружено, что узкие места в работе возникали, когда число посещений достигало более 3 миллионов.
2. Измененная конфигурация
- <Connector port = "9027"
- protocol = "HTTP/1.1"
- maxHttpHeaderSize = "8192"
- maxThreads = "1000"
- minSpareThreads = "100"
- maxSpareThreads = "1000"
- minProcessors = "100"
- maxProcessors = "1000"
- enableLookups = "false"
- compression = "on"
- compressionMinSize = "2048"
- compressableMimeType = "text/html,text/xml,text/javascript,text/css,text/plain"
- connectionTimeout = "20000"
- URIEncoding = "utf-8"
- acceptCount = "1000"
- redirectPort = "8443"
- disableUploadTimeout = "true" />
Интеллектуальная рекомендация
Реализация JavaScript Hashtable
причина Недавно я смотрю на «Структуру данных и алгоритм — JavaScript», затем перейдите в NPMJS.ORG для поиска, я хочу найти подходящую ссылку на библиотеку и записывать его, я могу исполь.
MySQL общие операции
jdbc Транзакция: транзакция, truncate SQL заявление Transaction 100 000 хранимая процедура mysql msyql> -определить новый терминатор,Пробелов нет mysql>delimiter // mysql> -создание хранимой .
Используйте Ansible для установки и развертывания TiDB
жизненный опыт TiDB — это распределенная база данных. Настраивать и устанавливать службы на нескольких узлах по отдельности довольно сложно. Чтобы упростить работу и облегчить управление, рекомендуетс.
Последняя версия в 2019 году: использование nvm под Windows для переключения между несколькими версиями Node.js.
С использованием различных интерфейсных сред вы можете переключаться между разными версиями в любое время для разработки. Например, развитие 2018 года основано наNode.js 7x версия разработана. Тебе эт.
![]()
Шаблон проектирования — Создать тип — Заводской шаблон
Заводская модель фабрикиPattern Решать проблему: Решен вопрос, какой интерфейс использовать принципСоздайте интерфейс объекта, класс фабрики которого реализуется его подклассом, чтобы процесс создания.