ObjectContext没有垃圾回收

时间:2014-11-21 18:32:16

标签: c# entity-framework

我们在控制台应用程序中运行一个非常简单的函数,它循环遍历数据库并将表列入变量。当然最初它做得更多,但我们把它剥离到只列出1表。

我们注意到,在ObjectContext的每个新创建中,内存增长大约5MB。我们有一个using()语句,即使在执行GC.Collect()时,内存也不会被释放。

当我们删除表的列表并只创建新的ClassEntities时,内存保持非常低。

我们尽力破坏并收集但无济于事,导致内存使用超过1GB。

这是主程序:

List < string > databases = (from x in admin_db.tblDbs select x.db_name).ToList();
foreach(var db_name in databases) {
    Console.WriteLine("Current db:" + db_name);
    var entityString = String.Format("metadata=<here we put the connection string>", db_name);
    using(ClassEntities db = new ClassEntities(entityString)) {
        try {
            List < tblDepartment > departments = db.tblDepartments.ToList();
            departments = null;
        } catch {}
    }
}

然后ClassEntities(剥离):

public partial class ClassEntities: ObjectContext {
    public ClassEntities(): base("name=ClassEntities", "ClassEntities") {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }
    public ClassEntities(string connectionString): base(connectionString, "ClassEntities") {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }
    public ClassEntities(EntityConnection connection): base(connection, "ClassEntities") {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }
}

非常感谢任何帮助或想法。

1 个答案:

答案 0 :(得分:0)

对象有两个垃圾收集条件:

  • 它超出了范围
  • 在程序的其他地方不再引用

当您的截屏视频显示您有循环引用时,会阻止预期的垃圾回收。

您的商品列表是引用连接,反过来引用您的商品(HorekoEntitiesNoLog)

尝试以下方法:

  • 确定构成循环引用对象图的对象引用的完整图形。
  • 识别此图表的入口点。
  • 清除图表任何入口点的引用。
  • 调用GC.Collect()。

如果在GC.Collect调用后内存未被释放,则表示您缺少入口点引用清除或图表未完成。