首页 > 解决方案 > Hibernate/Spring 的类加载泄漏

问题描述

我们有 Spring/Hibernate-Tests 目前会产生类加载泄漏。由于技术原因,springcontext 是根据测试方法启动的。随着 spring 上下文的初始化,一个休眠会话也被初始化。

我们可以观察到加载的类的数量正在稳步增加。使用 JProfiler 检查后,我们发现任何休眠会话的实例化都会触发所有实体类对象的负载。由于我们有三位数的休眠实体,这会导致元空间和压缩类空间的巨大膨胀。

问题是:为什么同一个类加载器一次又一次地加载相同的类,却没有意识到类对象已经加载了?

编辑:场景说明

此问题是作为软件现代化项目的一部分发生的,其中旧应用程序的功能被移植到应用程序的弹簧管理部分。在生产期间这工作正常 - 应用程序服务器初始化 spring 上下文(因此休眠),遗留核心通过一些静态访问器访问它。

在测试阶段,我们必须将遗留测试框架与 spring 核心集成。由于技术原因(旧的测试框架有些古怪),我们必须为每个测试重新建立 spring-context,而不是每个测试类。由于测试集中有相当多的测试,这最终会导致压缩类空间内的 OOME。

由于测试实际上使用了数据库连接,因此每个测试都会初始化一个休眠会话。我们使用的是 Spring 5.2.13 和 Hibernate 5.4.29。

标签: javaspringhibernateresource-leakclassloading

解决方案


推荐阅读