会话关闭后如何强制hibernate释放内存?

我们刚刚开始使用Hibernate并且仍然习惯它的工作方式。

在我们看到的事情上,即使在关闭所有会话并且引用超出范围之后,hibernate仍然似乎在其缓存中维护以前使用的数据库值。

我们的代码可以从多个过程中的一组表中读取。 因为所有的内存都非常谨慎地释放,后来的传递慢慢变成了爬行。

有没有办法强制Hibernate清除它的缓存?

显式调用System.gc()没有帮助。 (是的,我知道这是一个建议)

附加信息 :我们已明确禁用二级缓存。

您可以尝试调用Session.clear来强制清除第一级缓存。 请务必先调用Session.flush将任何挂起的更改写入数据库。 如果“修复”了问题,那么我怀疑某些东西仍然存在对会话的引用,从而阻止缓存中的对象被垃圾收集。 您可能需要获取程序的堆转储以跟踪泄漏。

Hibernate还有一个可选的二级缓存,它可以正常运行。 我同意Rob的观点,最简单的方法是在会话结束后查看内存中仍然存在的内容。

我目前最喜欢的工具是YourKit ,它是商业的,并不是很便宜。 他们曾经提供(并且可能仍然提供)非常便宜的个人许可证选项($ 99 IIRC)。 在对Alfresco ECM的堆使用问题进行故障排除时,我已经使用YourKit来完成此任务。 还有其他可用的工具(例如CodeGear JGears),据我所知,它也能很好地工作。

您可以考虑在评估模式下使用产品 – 如果发现您的问题,可能会获得保留;)