【发布时间】:2020-04-21 11:20:27
【问题描述】:
我的转储中有大约 15,000 个相同的 SessionFactoryImpl 对象:
具有传入引用的对象之一:
具有出站引用的对象之一:
我没有配置以下参数,它们是默认设置的:
hibernate.query.plan_cache_max_size
hibernate.query.plan_parameter_metadata_max_size
问题:
- 为什么有这么多 SessionFactoryImpl 对象,为什么没有 删除了吗?
- 它们是在代码中的某处创建不正确,还是由于 未指定的缓存参数?
- 如果是,我应该为缓存设置哪些参数?
- 我应该设置任何其他设置吗?
- 如果这些对象是在代码中创建的,我怎样才能找到 在 Jprofiler 中创建这些对象?
版本:
- 休眠 5.4.3.Final
- Spring 5.1.6.RELEASE
【问题讨论】:
-
它们在那里是因为它们是被创建的,这可能意味着您正在代码中做一些一开始就不应该做的事情。错误很可能出现在您自己的代码中,或者您认为应该如何使用 Spring(以错误的方式)。
-
使用MAT 之类的工具,您可以有特定的报告来分析内存泄漏(从未使用过jprofiler,但它似乎提供了类似STELLAR ANALYSIS OF MEMORY LEAKS 的功能)。尝试在这些查询中查看一个共同因素,并找出代码的哪一部分可能是导致此问题的主要原因。
-
为什么有这么多 SessionFactoryImpl 对象,为什么不删除它们?我知道为什么但也不应该删除它们 - 应该重用单例(只要 db config 是不变)
-
如果这些对象是在代码中创建的,我怎样才能在 Jprofiler 中找到创建这些对象的类? JVisualm 具有跟踪创建堆栈跟踪的选项 - 但这仅适用于分析运行时而不是“历史创建”JProfiler 可能会有类似的东西。
-
在堆遍历器的引用视图中尝试“合并支配引用”。
标签: java spring hibernate jprofiler