Spring Boot 嵌入式 tomcat 服务器占用 800 MB 内存?

Posted

技术标签:

【中文标题】Spring Boot 嵌入式 tomcat 服务器占用 800 MB 内存?【英文标题】:Spring boot embedded tomcat server take over 800 MB RAM? 【发布时间】:2018-08-13 19:40:55 【问题描述】:

我正在开发一个使用嵌入式 tomcat 服务器的 Springboot 应用程序。应用程序占用超过 800MB RAM。这很常见吗?有什么办法可以减少内存使用?

【问题讨论】:

【参考方案1】:

您的 tomcat 消耗的内存量完全取决于您的应用程序要求。 您需要对应用程序进行某种内存分析。

这很常见吗?

是的,我可以。这完全取决于您的应用程序、创建对象的方式以及对象使用的内存量。

您可以先将 -Xms 设置为 1GB,然后运行您的应用程序并执行正常操作。 使用JVisualVm 或JConsole 之类的工具来观察JVM 中不同类型对象的堆大小和GC 性能甚至消耗的内存量。

这将使您初步了解应用程序所需的堆数量。 在使用JMeter 之类的工具对您的应用程序进行负载测试后,检查负载如何阻碍您的堆使用。

推荐阅读: http://blog.manupk.com/2012/09/java-memory-model-simplified.html

【讨论】:

【参考方案2】:

这很常见。 Java VM 非常重。查看 JVM 启动标志,它会告诉您堆大小可以增长到多少(您可能会看到类似 -Xmx768m 的内容,它最多分配 768M 的堆)。您可以尝试设置CATALINA_OPTS 环境变量:CATALINA_OPTS=-Xmx512m,但如果启动 VM 的 springboot 脚本覆盖了这个,您将不得不跟踪脚本中设置的值。但是,如果您开始实例化需要一段时间才能被垃圾回收的许多或大型(读取:休眠)对象,默认值通常效果很好,并且可以防止 JVM 抛出内存错误。

【讨论】:

"-Xmx768m 分配 768M 的堆" - 其实就是设置最大堆大小。如果应用程序需要,堆只会增长到该大小。 JVM 的“重量”很大程度上取决于您正在运行的内容。【参考方案3】:

有什么办法可以减少内存使用?

有两种方法:

您可以尝试“挤压”堆大小。不建议这样做,因为这会导致 JVM 在 GC 中花费更大比例的 CPU,更频繁的 GC 暂停,最终导致 OOME。

这种方法通常根本不起作用;也就是说,它只会导致应用程序更快地死掉。

您可以弄清楚为什么您的应用程序使用了这么多内存。这可能是由于很多原因:

问题可能太大了。 您的应用程序可能会因各种不必要的库、功能等而“臃肿”。 您的内存数据结构可能设计不当。 您的应用程序可能在内存中缓存过多。 您的应用程序可能存在内存泄漏。

我同意@cowbert 的建议。使用性能监控工具来尝试跟踪使用了大部分 JVM 内存的内容。如果存在内存泄漏,这通常表现为某些类型的对象使用了意外的大量内存。

【讨论】:

以上是关于Spring Boot 嵌入式 tomcat 服务器占用 800 MB 内存?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 嵌入式 tomcat 服务器占用 800 MB 内存?

如何配置Spring Boot Tomcat

无法使用嵌入式tomcat服务器在spring boot中运行jsp文件

将 Spring Boot 战争部署到 Tomcat 服务器并收到“无法启动嵌入式 Tomcat org.springframework.context.ApplicationContextExcep

带有嵌入式 Tomcat 的 Spring Boot 忽略了方法角色

如何知道spring boot中嵌入了哪个tomcat版本