Автор оригинала: Amy DeGregorio.
1. введение
В этом уроке мы узнаем, как настроить размер кучи при запуске приложения Spring Boot. Мы будем настраивать параметры -Xms и -Xmx , которые соответствуют стартовому и максимальному размеру кучи.
Затем мы сначала используем Maven для настройки размера кучи при запуске приложения с помощью mvn в командной строке. Мы также рассмотрим, как мы можем установить эти значения с помощью плагина Maven. Затем мы упакуем ваше приложение в файл jar и запустим его с параметрами JVM , предоставленными команде java-jar .
Наконец, мы создадим файл .conf , который устанавливает JAVA_OPTS и запускает наше приложение как службу , используя метод инициализации Linux System V.
2. Бег от Maven
2.1. Передача параметров JVM
Давайте начнем с создания простого контроллера REST, который возвращает некоторую базовую информацию о памяти, которую мы можем использовать для проверки наших настроек:
@GetMapping("memory-status") public MemoryStats getMemoryStatistics() { MemoryStats stats = new MemoryStats(); stats.setHeapSize(Runtime.getRuntime().totalMemory()); stats.setHeapMaxSize(Runtime.getRuntime().maxMemory()); stats.setHeapFreeSize(Runtime.getRuntime().freeMemory()); return stats; }
Давайте запустим его как есть, используя mvn spring-boot:run для получения базовой линии. Как только ваше приложение запустится, мы можем использовать curl для вызова нашего RestController:
curl http://localhost:8080/memory-status
Наши результаты будут варьироваться в зависимости от вашей машины, но будут выглядеть примерно так:
{"heapSize":333447168,"heapMaxSize":5316280320,"heapFreeSize":271148080}
Для Spring Boot 2.x мы можем передавать аргументы в наше приложение с помощью -Spring-boot.run .
Давайте передадим начальный и максимальный размер кучи нашему приложению с аргументами -Spring-boot.run.jvm :
mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Xms2048m -Xmx4096m"
Теперь, когда мы достигнем нашей конечной точки, мы должны увидеть наши указанные настройки кучи:
{"heapSize":2147483648,"heapMaxSize":4294967296,"heapFreeSize":2042379008}
2.2. Использование плагина Maven
Мы можем избежать необходимости указывать параметры при каждом запуске нашего приложения, настроив spring-boot-maven-plugin в нашем pom.xml файл:
Давайте настроим плагин для установки желаемых размеров кучи:
org.springframework.boot spring-boot-maven-plugin com.baeldung.heap.HeapSizeDemoApplication true -Xms256m -Xmx1g
Теперь мы можем запустить наше приложение, используя только mvn spring-boot:run , и увидеть наши указанные аргументы JVM в использовании, когда мы пингуем нашу конечную точку:
{"heapSize":259588096,"heapMaxSize":1037959168,"heapFreeSize":226205152}
Любые аргументы JVM, которые мы настраиваем в нашем плагине, будут иметь приоритет над любыми аргументами, предоставленными при запуске из Maven с использованием Любые аргументы JVM, которые мы настраиваем в нашем плагине, будут иметь приоритет над любыми аргументами, предоставленными при запуске из Maven с использованием .
3. Работа с java -jar
Если мы запускаем наше приложение из файла j ar , мы можем предоставить аргументы JVM команде java .
Во-первых, мы должны указать упаковку как jar в вашем файле Maven:
jar
Затем мы можем упаковать наше приложение в файл j ar :
mvn clean package
Теперь, когда у нас есть файл j ar , мы можем запустить его с помощью java-jar и переопределить конфигурацию кучи:
java -Xms512m -Xmx1024m -jar target/spring-boot-runtime-2.jar
Давайте свернем нашу конечную точку, чтобы проверить значения памяти:
{"heapSize":536870912,"heapMaxSize":1073741824,"heapFreeSize":491597032}
4. Использование файла .conf
Наконец, мы узнаем, как использовать файл .conf для установки размера кучи в приложении, запущенном как служба Linux.
Давайте начнем с создания файла с тем же именем, что и у нашего приложения jar file и расширением .conf : spring-boot-runtime-2.conf .
Мы можем поместить это в папку в разделе ресурсы на данный момент и добавить нашу конфигурацию кучи в JAVA_OPTS :
JAVA_OPTS="-Xms512m -Xmx1024m"
Затем мы изменим вашу сборку Maven, чтобы скопировать файл spring-boot-runtime-2.conf в папку target рядом с нашим файлом jar :
${project.artifactId} src/main/resources/heap ${project.build.directory} true ${project.name}.conf org.springframework.boot spring-boot-maven-plugin com.baeldung.heap.HeapSizeDemoApplication true
Нам также необходимо установить выполнимый к истинный чтобы запустить наше приложение как службу.
Мы можем упаковать наш файл jar и скопировать ваш файл .conf с помощью Maven:
mvn clean package spring-boot:repackage
Давайте создадим наш init.d сервис:
sudo ln -s /path/to/spring-boot-runtime-2.jar /etc/init.d/spring-boot-runtime-2
Теперь давайте запустим наше приложение:
sudo /etc/init.d/spring-boot-runtime-2 start
Затем, когда мы достигнем нашей конечной точки, мы должны увидеть, что наши значения JAVA_OPT , указанные в файле .conf , соблюдаются:
{"heapSize":538968064,"heapMaxSize":1073741824,"heapFreeSize":445879544}
5. Заключение
В этом коротком руководстве мы рассмотрели, как переопределить параметры кучи Java для трех распространенных способов запуска приложений Spring Boot. Мы начали с Maven, изменив значения в командной строке, а также установив их в плагине Spring Boot Maven.
Затем мы запустили наше приложение jar файл, используя java-jar и передав аргументы JVM.
Наконец, мы рассмотрели одно возможное решение на уровне производства, установив a . conf файл рядом с нашим fat jar и создание службы инициализации System V для запуска нашего приложения.
Существуют и другие решения для создания служб и демонов из Spring Boot fat jar, и многие из них предоставляют конкретные способы переопределения аргументов JVM.
Как всегда, пример кода доступен на GitHub .