«1. Введение
В этом руководстве мы узнаем, как настроить размер кучи при запуске приложения Spring Boot. Мы будем настраивать параметры -Xms и -Xmx, которые соответствуют начальному и максимальному размеру кучи.
Затем мы сначала воспользуемся Maven для настройки размера кучи при запуске приложения с помощью mvn в командной строке. Мы также рассмотрим, как мы можем установить эти значения с помощью подключаемого модуля Maven. Затем мы упакуем наше приложение в файл jar и запустим его с параметрами JVM, предоставленными команде java -jar.
Наконец, мы создадим файл .conf, который устанавливает JAVA_OPTS, и запустим наше приложение как службу, используя технику Linux System V Init.
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 для вызова нашего контроллера REST:
curl http://localhost:8080/memory-status
Наши результаты будут различаться в зависимости от нашей машины, но будут выглядеть примерно так:
{"heapSize":333447168,"heapMaxSize":5316280320,"heapFreeSize":271148080}
Для Spring Boot 2.x, мы можем передать аргументы нашему приложению, используя -Dspring-boot.run.
Давайте передадим начальный и максимальный размер кучи нашему приложению с помощью -Dspring-boot.run.jvmArguments:
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:
Давайте настроим подключаемый модуль для установки желаемых размеров кучи. :
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<configuration>
<mainClass>com.baeldung.heap.HeapSizeDemoApplication</mainClass>
</configuration>
</execution>
</executions>
<configuration>
<executable>true</executable>
<jvmArguments>
-Xms256m
-Xmx1g
</jvmArguments>
</configuration>
</plugin>
</plugins>
Теперь мы можем запустить наше приложение, используя только mvn spring-boot:run, и увидеть, как используются указанные нами аргументы JVM, когда мы пингуем нашу конечную точку:
{"heapSize":259588096,"heapMaxSize":1037959168,"heapFreeSize":226205152}
Любые аргументы JVM, которые мы настраиваем в нашем плагине будет иметь приоритет над любым, предоставленным при запуске из Maven с использованием -Dspring-boot.run.jvmArguments.
3. Запуск с помощью java -jar
Если мы запускаем наше приложение из файла jar, мы можем предоставить аргументы JVM для команды java.
Во-первых, мы должны указать упаковку как jar в нашем файле Maven:
<packaging>jar</packaging>
Затем мы можем упаковать наше приложение в файл jar:
mvn clean package
Теперь, когда у нас есть файл jar, мы можно запустить с помощью java -jar и переопределить конфигурацию кучи:
java -Xms512m -Xmx1024m -jar target/spring-boot-runtime-2.jar
Давайте свернем нашу конечную точку, чтобы проверить значения памяти:
{"heapSize":536870912,"heapMaxSize":1073741824,"heapFreeSize":491597032}
4. Использование файла .conf
Наконец, мы узнайте, как использовать файл .conf для установки размера кучи в приложении, работающем как служба Linux.
Начнем с создания файла с тем же именем, что и у jar-файла нашего приложения, и расширением .conf: spring-boot-runtime-2.conf.
Сейчас мы можем поместить это в папку ресурсов и добавить нашу конфигурацию кучи в JAVA_OPTS:
JAVA_OPTS="-Xms512m -Xmx1024m"
Далее мы собираемся изменить нашу сборку Maven, чтобы скопировать spring-boot-runtime-2. conf в нашу целевую папку рядом с нашим файлом jar:
<build>
<finalName>${project.artifactId}</finalName>
<resources>
<resource>
<directory>src/main/resources/heap</directory>
<targetPath>${project.build.directory}</targetPath>
<filtering>true</filtering>
<includes>
<include>${project.name}.conf</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<configuration>
<mainClass>com.baeldung.heap.HeapSizeDemoApplication</mainClass>
</configuration>
</execution>
</executions>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
</plugins>
</build>
Нам также нужно установить для исполняемого файла значение 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.
Наконец, мы рассмотрели одно из возможных решений производственного уровня, установив файл .conf рядом с нашим толстым банком и создав службу инициализации System V для запуска нашего приложения.
Существуют и другие решения для создания сервисов и демонов из толстой банки Spring Boot, и многие из них предоставляют конкретные способы переопределения аргументов JVM.
«Как всегда, пример кода доступен на GitHub.