连接了堆转储的流畅 Nhibernate 内存泄漏

本文关键字:Nhibernate 内存 泄漏 转储 连接 | 更新日期: 2023-09-27 18:33:02

我知道2008年发布的查询缓存以前存在Nhibernate问题。 我正在使用Fluent NHibernate1.4.0和NHibernate 3.3.1。 我正在运行一个同步程序,该程序从多个会话打开并在处理大型数据集时创建多个查询。 我使用的所有数据结构都终止了,并且长度通常是有限的。 我从CLRProfiler工具中了解到,类SessionFactoryImpl正在变大。

下面是应用程序的内存堆转储

转到 https://app.box.com/s/pvbe9ryfb0v168rka2e3 处的链接以查看内存堆转储。

在整个应用程序中使用无状态会话,并且我正在使用块包装所有内容。 我已将我的会话工厂创建者设置为具有以下行

return Fluently.Configure().Database(cfg).Mappings(m => {
            var fluentMappings = m.FluentMappings;
            fluentMappings.Add<UCBPremMap>();
            fluentMappings.Add<UTVSSFXMap>();
        }).Cache(c => {
            c.Not.UseQueryCache();
            c.Not.UseSecondLevelCache();
        }).BuildSessionFactory();

但我认为从我对堆图的解释来看,NHibernate 缓存数据结构会继续增长,直到内存不足。

堆栈溢出通常也会在尝试解析另一个表达式树时发生(我试图尽量减少数据库调用,有时我只能按内容搜索字段,这会创建一个包含 1000 个单独 where 子句的表达式树(。

任何帮助将不胜感激。 我的同事,在另一个程序上,也注意到他的程序遇到了 OutOfMemory 异常,这也表明 NHibernate 中存在内存泄漏。

连接了堆转储的流畅 Nhibernate 内存泄漏

这是我在Google网上论坛上发表的帖子,具有相同的问题。 https://groups.google.com/forum/#!topic/nhusers/LDYlxhUPZuo

我已经解决了这个问题,使用反射来访问 QueryPlanCache 中的 planCache 字段,并将 Hashtable 设置为从 128 到 8 的内容大小。