如何在启动Spring Boot应用程序时配置嵌入式Tomcat的堆大小?

43

我正在尝试部署一个由Spring Boot支持的Web应用程序到生产环境中。该应用程序使用Spring Boot 1.0.1构建,并将默认的Tomcat 7嵌入为应用程序服务器。当使用java -jar myapp.jar命令行启动应用程序时,我希望为应用程序分配更大的内存。

我应该使用JVM参数,例如-Xms -Xmx,还是使用环境变量,例如JAVA_OPTS?我已经尝试在文档或Google中寻找答案,但没有得到答案。是否有人可以给一些提示?

5个回答

75
如果使用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 2.0.0.M6。Spring Boot Maven插件文档指定它应该工作,但实际上并没有。我看到两个选项,要么将配置指定到pom.xml中(这样可以工作),要么将Spring Boot Maven插件的版本指定为1.5.9-RELEASE(这也可以工作)。 - Vlad Dinulescu
正如Vlad Dinulescu所提到的,它只适用于一组Spring Boot版本。对于一个版本,它可以工作,但对于2.0.3.RELEASE版本则不行。Zhang Buzz在答案中提供了解决方案。 - hipokito

45

考虑到这是一个关于Spring Boot的问题,我认为比@DaveSyer的回答更有用的是:

你可以在与你的WAR文件相同的目录中放置一个名为.conf的文件,该文件实际上是一个shell脚本。

例如,

$ ls
myapp.conf
myapp.war
$ cat myapp.conf
export JAVA_OPTS="-Xmx1024m -Xms256m"
任何配置都将在Spring Boot嵌入式Tomcat启动之前运行。个人建议,在应用程序本身中版本控制一个.conf.example文件,然后将其副本放置在每个部署到的服务器上。当然,您可以使用命令行操作覆盖在.conf文件中设置的任何内容。

5
非常美丽,而且对于.jar文件也有效。我<3 Spring Boot。 - dustmachine
从哪个版本开始可用? - lrkwz
1
我尝试使用Spring Boot 1.5.9,但它没有识别我的配置:在与jar文件同名的.conf文件中导出JAVA_OPTS="java.net.preferIPv4Stack=true"。使用nohup执行java -jar命令。 - Mahesh

26

只需使用您通常用于设置JVM的任何常规机制。 文档在命令行上可用:

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

那么,我可以将它增加到比正常情况下更高的水平(例如10倍)吗?这会对应用程序、JVM或机器产生什么样的开销? - Satish Patro

18

在Spring Boot 2中,您需要在pom.xml文件中指定堆大小,如下所示:

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

14

对于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还是2,您都可以这样做:

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

属性 spring-boot.run.jvmArguments 生效了。谢谢。 - kirenpillay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接