gpt4 book ai didi

spring-boot - Spring Boot - 内存泄漏 - H2 数据库 - 不注销驱动程序

转载 作者:行者123 更新时间:2023-12-04 15:31:09 25 4
gpt4 key购买 nike

由于新信息而完全返工:

  • 最初的问题:当多次重新部署一个简单的 Spring Boot 应用程序 (2.2.6) 时,JBoss 因“OutOfMemoryError: Metaspace”而自杀

  • 使用堆转储我发现 H2 驱动程序 (1.4.200) 保留了一个引用并导致了一个问题 enter image description here

  • 后来查了一下为什么tomcat不是这样的,发现

    Web 应用程序 [killerApp] 注册了 JDBC 驱动程序 [org.h2.Driver],但在 Web 应用程序停止时无法注销它。为防止内存泄漏,已强制取消注册 JDBC 驱动程序。

所以它只在 tomcat 中工作,因为它足够聪明,可以注意到内存泄漏并阻止它。 JBoss不做,遇到麻烦...

看起来带有 H2 的标准 spring boot 应用程序在处理注销 H2 驱动程序方面行为不端......至少这是我的收获。

我还找到了这个:GitHub - Spring Boot - Discussion about unregister managed JDBC drivers

现在我不确定,谁在“过错”?

  1. 我,因为我需要妥善注销 H2 驱动程序
  2. 我是因为我错误地配置了 Spring Boot 应用
  3. 用于保持内部状态的 H2 驱动程序?
  4. 用于在 Tomcat 上中继以进行整理的 Spring boot

最好,非常感谢

最佳答案

又是一个使用 MAT 和 OOM 的周末,我现在修复了内存泄漏问题。

首先,我现在在 ContextListener 中手动取消注册从 Spring Boot 启动的 JDBC 驱动程序(从 2.3.0 开始,Spring boot 将自动取消注册 -> https://github.com/spring-projects/spring-boot/issues/21221)。这解决了第一个内存泄漏问题。

另一个来自io.github.classgraph。 destroy 是作为应用程序关闭 Hook 添加的,它仅在 JVM 关闭时执行。 -> 对于一直运行的应用程序服务器来说不是一个好主意。他们修复了它,但 springdoc-openapi-ui/org.webjars:webjars-locator-core 仍在使用带有错误的旧版本。所以我手动增加了类图版本。这解决了第二个内存泄漏...该死的我从来不想知道这么多关于这些东西(否则我会用 C :D 编程)

问题解决:)

关于spring-boot - Spring Boot - 内存泄漏 - H2 数据库 - 不注销驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61253876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com