连接了堆转储的流畅 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 中存在内存泄漏。
这是我在Google网上论坛上发表的帖子,具有相同的问题。 https://groups.google.com/forum/#!topic/nhusers/LDYlxhUPZuo
我已经解决了这个问题,使用反射来访问 QueryPlanCache 中的 planCache 字段,并将 Hashtable 设置为从 128 到 8 的内容大小。