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