Spring 引导 - 内存泄漏 - H2 数据库 - 不注销驱动程序
Spring Boot - Memory Leak - H2 Database - Does not unregister driver
根据新信息完全修改:
初始问题:JBoss 多次重新部署一个简单的 Spring 引导应用程序 (2.2.6) 时,因“OutOfMemoryError: Metaspace”而自杀
使用堆转储我发现 H2 驱动程序 (1.4.200) 保留了一个引用并导致了问题
后来我查了一下为什么tomcat不是这样的,发现
The web application [killerApp] registered the JDBC driver [org.h2.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
所以它只在 tomcat 中工作,因为它足够聪明,可以注意到内存泄漏并阻止它。 JBoss不做,遇到麻烦...
看起来标准的 spring 带 H2 的启动应用程序在处理注销 H2 驱动程序方面行为不端......至少这是我的收获。
我还找到了这个:GitHub - Spring Boot - Discussion about unregister managed JDBC drivers
现在我不确定,谁在“过错”?
- 我是因为我需要注意正确注销 H2 驱动程序
- 我是因为我错误配置了 Spring 启动应用程序
- 用于保持内部状态的 H2 驱动程序?
- Spring 开机中继 Tomcat 整理
非常感谢
又是一个与 MAT 和 OOM 相关的周末,我现在修复了内存泄漏问题。
首先,我现在在 ContextListener 中手动取消注册从 Spring 启动启动的 JDBC 驱动程序(从 2.3.0 Spring 启动将自动取消注册 -> https://github.com/spring-projects/spring-boot/issues/21221) .
这解决了第一个内存泄漏问题。
另一个来自io.github.classgraph。 destroy 是作为应用程序关闭挂钩添加的,它仅在 JVM 关闭时执行。 -> 对于永远 运行 的应用程序服务器来说不是一个好主意。他们修复了它,但是 springdoc-openapi-ui / org.webjars:webjars-locator-core 仍在使用带有错误的旧版本。所以我手动增加了类图版本。
这解决了第二次内存泄漏......该死的我从来不想知道这么多关于这些东西的东西(否则我会在 C 中编程:D)
问题已解决:)
根据新信息完全修改:
初始问题:JBoss 多次重新部署一个简单的 Spring 引导应用程序 (2.2.6) 时,因“OutOfMemoryError: Metaspace”而自杀
使用堆转储我发现 H2 驱动程序 (1.4.200) 保留了一个引用并导致了问题
后来我查了一下为什么tomcat不是这样的,发现
The web application [killerApp] registered the JDBC driver [org.h2.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
所以它只在 tomcat 中工作,因为它足够聪明,可以注意到内存泄漏并阻止它。 JBoss不做,遇到麻烦...
看起来标准的 spring 带 H2 的启动应用程序在处理注销 H2 驱动程序方面行为不端......至少这是我的收获。
我还找到了这个:GitHub - Spring Boot - Discussion about unregister managed JDBC drivers
现在我不确定,谁在“过错”?
- 我是因为我需要注意正确注销 H2 驱动程序
- 我是因为我错误配置了 Spring 启动应用程序
- 用于保持内部状态的 H2 驱动程序?
- Spring 开机中继 Tomcat 整理
非常感谢
又是一个与 MAT 和 OOM 相关的周末,我现在修复了内存泄漏问题。
首先,我现在在 ContextListener 中手动取消注册从 Spring 启动启动的 JDBC 驱动程序(从 2.3.0 Spring 启动将自动取消注册 -> https://github.com/spring-projects/spring-boot/issues/21221) . 这解决了第一个内存泄漏问题。
另一个来自io.github.classgraph。 destroy 是作为应用程序关闭挂钩添加的,它仅在 JVM 关闭时执行。 -> 对于永远 运行 的应用程序服务器来说不是一个好主意。他们修复了它,但是 springdoc-openapi-ui / org.webjars:webjars-locator-core 仍在使用带有错误的旧版本。所以我手动增加了类图版本。 这解决了第二次内存泄漏......该死的我从来不想知道这么多关于这些东西的东西(否则我会在 C 中编程:D)
问题已解决:)