Как настроить размер кучи при запуске приложения 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, я бы сказал, что более полезный ответ, чем у @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}