ObjectContext 不是垃圾回收

本文关键字:ObjectContext | 更新日期: 2023-09-27 18:31:29

我们正在控制台应用程序中运行一个非常简单的函数,该函数循环访问数据库并将表列出到变量中。当然,最初它做得更多,但我们将其剥离为仅列出 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 {}
    }
}

然后是类实体(剥离):

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();
    }
}

任何帮助或想法将不胜感激。

ObjectContext 不是垃圾回收

垃圾

回收对象有 2 个条件:

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

正如截屏视频所示,您有循环引用来阻止预期的垃圾回收。

您的项目

列表引用了连接,而连接又引用了您的项目(HorekoEntitiesNoLog)

请尝试以下操作:

  • 确定构成循环引用对象图的对象引用的完整图形。
  • 标识和此图的入口点。
  • 清除图形任何入口点的引用。
  • 调用 GC。收集()。

如果 GC 后未释放内存。收集调用,要么您缺少入口点引用清除,要么您的图形不完整。