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

Posted

技术标签:

【中文标题】使用嵌入式 Tomcat 启动 Spring Boot 应用程序时如何配置堆大小?【英文标题】:How can I configure the heap size when starting a Spring Boot application with embedded Tomcat? 【发布时间】:2014-05-29 03:02:42 【问题描述】:

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

我应该使用JVM参数如-Xms -Xmx还是使用环境变量如JAVA_OPTS?我试图在文档中寻找答案或谷歌它,但我没有得到答案。谁能给点提示?

【问题讨论】:

【参考方案1】:

对于 Spring Boot 1,要在插件配置中指定的 Maven 参数为jvmArguments,用户属性为run.jvmArguments

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

对于 Spring Boot 2,要在插件配置中指定的 Maven 参数也是 jvmArguments,但 user 属性现在是 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 有效。谢谢。【参考方案2】:

对于 Spring Boot 2,您必须在 pom.xml 文件中指定堆大小,如下所示:

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

【讨论】:

【参考方案3】:

如果使用spring-boot plugin 启动应用程序:

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

否则如果running java -jar:

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

【讨论】:

这似乎不适用于 Spring Boot 2.0.0.M6。 Spring Boot Maven plugin documentation 指定它应该工作,但它没有。我看到两个选项,要么在 pom.xml 中指定配置(有效),要么将 Spring Boot Maven 插件的版本指定为 1.5.9-RELEASE(也有效)。 就像 Vlad Dinulescu 提到的那样,它只适用于一组 Spring Boot 版本。对于一个版本它有效,对于 2.0.3.RELEASE 它没有。 Zhang Buzz 的回答解决方案。【参考方案4】:

由于这是一个专门的 Spring Boot 问题,我认为比@DaveSyer 更有用的答案是:

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

例如,

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

您在那里所做的任何配置都将在 Spring Boot 嵌入式 Tomcat 启动之前运行。就个人而言,我在我的应用程序本身中对.conf.example 文件进行版本控制,然后将其副本放在我部署到的每台服务器上。

当然,您在 .conf 文件中设置的任何内容都可以通过命令行操作覆盖。

【讨论】:

这太漂亮了。它也适用于 .jar 文件。我 自哪个版本可用? 我尝试使用 spring boot 1.5.9,但它没有拾取我的 conf: export JAVA_OPTS="java.net.preferIPv4Stack=true" 在 .conf 文件中与 jar 文件命名相同。使用 nohup 使用 java -jar 执行。【参考方案5】:

只需使用任何正常的机制来设置 JVM。命令行上提供了文档:

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

【讨论】:

那么,我可以将其增加得比平时多(比如 10X)吗?应用程序或 JVM 或机器的开销是多少?

以上是关于使用嵌入式 Tomcat 启动 Spring Boot 应用程序时如何配置堆大小?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Spring Boot 中启动嵌入式 Tomcat [重复]

Spring Boot:如何禁用 Tomcat 启动日志记录?

Spring启动嵌入式tomcat服务器占用800 MB RAM?

Spring Boot如何启动嵌入式Tomcat?

无法启动 bean 'webServerStartStop';无法启动嵌入式 Tomcat 服务器 - spring-boot-starter-web

无法在 Eclipse 中启动 Spring Boot App:无法启动嵌入式 Tomcat