[spring-projects/spring-boot]自 2.0.1 起出现 OOM 异常和崩溃

2024-04-23 773 views
9

我刚刚从 2.0.0-RELEASE 升级到 2.0.1-RELEASE,并且我看到 OOM 异常和/或我的 Spring Boot 应用程序完全崩溃。自从从 2.0.0-RELEASE 升级到 2.0.1-RELEASE 以来,我没有对我的服务器或应用程序本身进行任何软件或硬件更改,并且在 2.0.0-RELEASE 或之前的任何版本下我没有遇到这些问题。我一直使用 Maven 插件来运行我的服务器,如下所示:

sudo mvn spring-boot:run -Drun.jvmArguments="-Xmx14336m"

请注意向 JVM 分配的最大内存量。这是必要的,因为我的应用程序非常占用内存。似乎设置 JVM 参数不再正常工作或无法按照我的预期工作,因为我在 Spring Boot 日志中看到了很多这样的内容:

2018-04-09 07:03:53.616 错误 6922 --- [https-openssl-nio-443-exec-245] oaccC[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet ] 在路径 [] 的上下文中抛出异常 [处理程序调度失败;嵌套$ java.lang.OutOfMemoryError:Java堆空间

自 2.0.0-RELEASE 以来,我一直在 Java 9 下运行,没有出现任何问题:

java 9.0.4 Java(TM) SE 运行时环境(版本 9.0.4+11) Java HotSpot(TM) 64 位服务器 VM(版本 9.0.4+11,混合模式)

目前,我已降级回 2.0.0-RELEASE,这似乎已经解决了 OOM 异常和崩溃问题。

在 2.0.1 中,向 Spring Boot 或通过 Maven 插件分配更多内存的首选方式是否发生了变化?我无法找到任何相关信息,但如果某处描述了这一点,而我只是错过了,我深表歉意。预先感谢您的任何帮助。

回答

3

感谢您的报告,但如果没有更多信息,就不可能诊断明显的内存泄漏。重现该问题的示例将是理想的选择。否则,发生 OutOfMemoryError 时进行的堆转储可能有助于查明问题。

当我在这里时,我对您如何运行应用程序进行了一些观察(这可能不是 OOME 的原因):

  • 不建议以 root 身份运行应用程序(使用 sudo)。
  • spring-boot:run仅供开发期间使用。从报告中尚不清楚您是否也在其他环境中使用它。
9

我将尝试构建一个快速的 Spring Boot 应用程序,该应用程序分配大量内存来重现该问题。但请注意,我不认为这是内存泄漏情况;在从 2.0.0-RELEASE 升级到 2.0.1-RELEASE 之前,我密切监视了应用程序的内存使用情况,该应用程序已连续运行数周和数月,没有发现任何异常情况。这就是为什么我询问可能与内存分配或 JVM 参数分配或 2.0.1-RELEASE 的 Maven 插件相关的任何更改,因为这个问题突然出现在我身上,而且我还没有做出任何其他更改变化;我的应用程序远未消耗我在抛出异常或崩溃之前尝试分配给它的~14GB。

我不知道这spring-boot:run不适合在生产中使用。我确实在那里使用它。

2

谢谢。我们不知道 Boot 2.0.1 中的任何更改会对内存使用产生任何重大影响。我们需要查看示例或堆转储才能在这方面取得任何进展。

我不知道 spring-boot:run 不适合在生产中使用。我确实在那里使用它。

我预计典型的生产环境不会安装 Maven。更典型的过程是在开发期间使用spring-boot:run,然后在准备部署时构建.jar存档 ( )。将mvn package.jar复制到生产环境并使用 运行java -jar

当您使用 运行应用程序时mvn spring-boot:run,您将在与 Maven 本身运行所在的同一个 JVM 中运行您的应用程序,或者 Maven 将在一个单独的 JVM 中运行,该 JVM 分叉了运行您的应用程序的 JVM。无论哪种情况,您都会浪费资源,并使生产应用程序面临 Maven 中的问题,包括安全漏洞。

5

您可以尝试的一项快速实验是暂时降级 Spring 框架版本(但不要在生产中运行)。框架对注释缓存进行了一些更改,我想知道它们是否会导致意外的内存问题。

5

@wilkinsona 感谢您提供额外信息。从现在开始,我将研究在生产中以这种方式做事。抱歉之前没有意识到这一点。

@philwebb 在遇到我今天早上用 2.0.1-RELEASE 描述的问题后,我一整天都在生产环境中运行 2.0.0-RELEASE,没有出现任何问题。有没有建议的方法可以仅降级框架而不降级整个引导,以便我可以尝试这个?

5

@jamespizzurro 将spring.versionpom.xml 中的属性设置为5.0.4.RELEASE。请参阅文档的这一部分。

1

如果您希望我们查看此问题,请提供所需的信息。如果在接下来的 7 天内未提供信息,此问题将被关闭。

4

我有类似的问题。我启动应用程序时仅在后台运行 Rabbit 集成。经过短暂的OOM。我刚刚重新启动以获得堆转储。

1

由于缺乏所需的反馈而关闭。如果您希望我们查看此问题,请提供所需的信息,我们将重新打开该问题。

2

抱歉,我没有就此回复您。我不明白 Github 是如何追踪这个的。我没看到对话。

自从我升级到之后就没有出现过这个问题了5.0.4.RELEASE</spring.version>。

5

抱歉,我也忘记了这一点; Spring Boot 2.0.0 可以避免这个问题。我将尝试建议的解决方法5.0.4.RELEASE</spring.version> 现在在 2.0.1 上,看看会发生什么。如果我不回来报告,那就成功了。

6

如果我不回来报告,那就成功了。

请回来报告。如果有效,那么这就是 Spring 框架中的回归,我们需要弄清楚那是什么。

4

如果您希望我们查看此问题,请提供所需的信息。如果在接下来的 7 天内未提供信息,此问题将被关闭。

8

由于缺乏所需的反馈而关闭。如果您希望我们查看此问题,请提供所需的信息,我们将重新打开该问题。

8

我无意再次提及此问题,但我只是想向可能发现此问题的任何人报告,此问题似乎至少从 2.0.3 开始已得到修复(跳过 2.0.2,因此我从未测试过它)。这也没有上面讨论的任何解决方法。