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 .