Как настроить размер кучи при запуске приложения Spring Boot со встроенным Tomcat?

Я пытаюсь развернуть веб-приложение на основе Spring Boot в производство. Приложение построено с использованием Spring Boot 1.0.1 и имеет встроенный Tomcat 7 в качестве сервера приложений. Я хочу выделить больше памяти для приложения при запуске приложения с java -jar myapp.jar командная строка.
Должен ли я использовать параметр JVM, такой как -Xms -Xmx или используйте переменную окружения, такую ​​как JAVA_OPTS? Я попытался найти ответ в документации или Google, но не получил ответ. Кто-нибудь может дать несколько советов?

6 ответов

Решение

Просто используйте любой обычный механизм для настройки JVM. Документы доступны в командной строке:

$ java -X
...
-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
...

Если запуск приложения с spring-boot плагин:

mvn spring-boot:run -Drun.jvmArguments="-Xmx512m" -Drun.profiles=dev

В противном случае, если работаетjava -jar:

java -Xmx512m -Dspring.profiles.active=dev -jar app.jar

Поскольку это вопрос Spring Boot, я бы сказал, что более полезный ответ, чем у @DaveSyer's:

Вы можете бросить .conf файл в той же директории, что и ваша WAR, которая по сути является сценарием оболочки.

например

$ ls
myapp.conf
myapp.war
$ cat myapp.conf
export JAVA_OPTS="-Xmx1024m -Xms256m"

Любая конфигурация, которую вы там сделаете, будет запущена до запуска Tomcat, встроенного в Spring Boot. Лично я управляю версией .conf.example файл в самом приложении, а затем поместите его копию на каждый сервер, на котором я развернул.

Конечно, все, что вы установите в этом .conf файл может быть переопределен с помощью операций командной строки.

За Spring Boot 2, вы должны указать размер кучи в pom.xml как показано ниже:

        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <jvmArguments>-Xmx64m</jvmArguments>
            </configuration>
        </plugin>

Для Spring Boot 1 аргумент Maven, который необходимо указать в конфигурации плагина, равен jvmArguments, а свойство пользователя - run.jvmArguments:

mvn spring-boot:run -Drun.jvmArguments="-Xms2048m -Xmx4096m"

Для Spring Boot 2 аргумент Maven, который необходимо указать в конфигурации плагина, также jvmArguments, но свойство пользователя теперь spring-boot.run.jvmArguments:

mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Xms2048m -Xmx4096m"

Итак, если вы используете способ конфигурации плагина, как для Spring Boot 1, так и для Spring Boot 2, вы можете сделать это:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <jvmArguments>
            -Xms4048m
            -Xmx8096m
        </jvmArguments>
    </configuration>
</plugin>

Для этого вопроса уже есть решения , я просто опубликую способ проверить статистику вашей памяти, чтобы убедиться, что они были установлены правильно:

      @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}

Давайте передадим начальный и максимальный размер кучи нашему приложению с помощью -Dspring-boot.run.jvmArguments:

      mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Xms2048m -Xmx4096m"

Теперь, когда мы достигаем конечной точки, мы должны увидеть указанные нами настройки кучи:

      {"heapSize":2147483648, "heapMaxSize":4294967296, "heapFreeSize":2042379008}
Другие вопросы по тегам