日期:2014-05-20  浏览次数:20987 次

Entity Framework中的内存泄漏问题
最近发现在entity framework中出现内存泄漏的问题。实体对象总是包含着ObjectContext的引用,即便在ObjectContext已经被Dispose的情况下。
通常我们都会使用“using”语句或者手动调用obj.dispose()来销毁ObjectContext。我希望在销毁该对象后,对应的内存空间会被回收。但实际我通过.net memory profiler查看内存对象的时候发现ObjectContext并没有被回收,上面提示“对象已经销毁但没有被垃圾回收”。原因是我需要将实体对象“user”存在session中(在session的有效期内,user对象不会被回收),而"user"包含了对"ObjectContext"的引用。 
C# code
Users user = null; 
using (B2CEntities context = new B2CEntities())
{
  user = context.Users.First(); 
}
Session.Add(user.OID.ToString(), user);
 
user对象查出来后默认的状态是“Unchanged”,我发现如果手动调用context.detach(user), user的状态变为“Detached”,就不会引用context,也就不会产生内存泄漏的问题。然而这样会产生另外一个问题,detach后user中所有导航属性都会变成“Unload”。无疑这不是可行的方法。
不清楚这是否entity framework的Bug,各位大牛有何建议?
在msdn上也发了贴,请参考这里http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/eace1b85-a15b-48cc-aaa4-17cf85f1111c

------解决方案--------------------
你的考虑可能是多余的,内存不会泄漏,因为调用dispose()来销毁ObjectContext后,虽然objectContext可能被user引用不能放掉,但在ObjectContext里dispose()已经把有关的托管与非托管的资源全部释放掉了,只留自已的属性指针与方法表指针,占用的可能内存也就是,32位地址=4个字节,多个地址,也就几十个字节,这样在session的user中带有是没有任何关系的。如果你再新建个ObjectContext后,把session中的user指向它,那原来的ObjectContext,就会被回收掉。