java - Hibernate/Spring 的类加载泄漏
问题描述
我们有 Spring/Hibernate-Tests 目前会产生类加载泄漏。由于技术原因,springcontext 是根据测试方法启动的。随着 spring 上下文的初始化,一个休眠会话也被初始化。
我们可以观察到加载的类的数量正在稳步增加。使用 JProfiler 检查后,我们发现任何休眠会话的实例化都会触发所有实体类对象的负载。由于我们有三位数的休眠实体,这会导致元空间和压缩类空间的巨大膨胀。
问题是:为什么同一个类加载器一次又一次地加载相同的类,却没有意识到类对象已经加载了?
编辑:场景说明
此问题是作为软件现代化项目的一部分发生的,其中旧应用程序的功能被移植到应用程序的弹簧管理部分。在生产期间这工作正常 - 应用程序服务器初始化 spring 上下文(因此休眠),遗留核心通过一些静态访问器访问它。
在测试阶段,我们必须将遗留测试框架与 spring 核心集成。由于技术原因(旧的测试框架有些古怪),我们必须为每个测试重新建立 spring-context,而不是每个测试类。由于测试集中有相当多的测试,这最终会导致压缩类空间内的 OOME。
由于测试实际上使用了数据库连接,因此每个测试都会初始化一个休眠会话。我们使用的是 Spring 5.2.13 和 Hibernate 5.4.29。
解决方案
推荐阅读
- c++ - 如何从.txt文件中逐个获取单词到字符串
- templates - 行号和编程语言
- amazon-lex - Lex 可以使用 AWS Pinpoint 接收彩信图像 - 目标是将用户发送的图像存储在 DynamoDB 中
- javascript - 如何将firebase存储下载URL保存到firestore集合?
- arrays - 如何使 SPARKLINE 折线图仅动态显示过去 7 天和其他时间段?
- python - 有没有办法在熊猫中使用方法/函数作为 .loc() 的表达式?
- python - Django/Wagtail - 如何在模板中创建一个条件来检查 url 路径?
- asp.net-core - 身份令牌重置密码 ASP.NET Core 3.1 的问题
- android - 如图所示,如何实现交错布局管理器的高度
- javascript - ngClass 和 onClick 不适用于 Div