Перейти к основному содержимому

Настройка размера кучи при запуске приложения Spring Boot

· 4 мин. чтения

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.foreach.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

Если мы запускаем наше приложение из файла aj ar , мы можем предоставить аргументы JVM для команды java .

Во-первых, мы должны указать упаковку как jar в нашем файле Maven:

<packaging>jar</packaging>

Затем мы можем упаковать наше приложение в файл aj 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 -файл нашего приложения, и расширением .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.foreach.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 .