Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ObjectContext未被垃圾收集_C#_Entity Framework - Fatal编程技术网

C# ObjectContext未被垃圾收集

C# ObjectContext未被垃圾收集,c#,entity-framework,C#,Entity Framework,我们在一个控制台应用程序中运行一个非常简单的函数,该函数在数据库中循环,并将一个表列成一个变量。当然,最初它做的更多,但我们将其简化为清单1 我们注意到,每次新创建ObjectContext时,内存都会增加大约5MB。对于它,我们有一个using()语句,即使在执行GC.Collect()时,内存也不会被释放 当我们删除表的列表并只创建新的ClassEntities时,内存仍然很低 我们用尽一切办法来破坏和收集,但都没有成功,导致内存使用超过1GB 以下是主要节目: List < stri

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

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

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

  • 它超出了范围
  • 它不再在程序的其他地方引用
正如您的屏幕广播所显示的,您有阻止预期垃圾回收的循环引用

您的项目列表引用的是连接,而连接反过来引用的是您的项目(HorekoEntitiesNoLog)

请尝试以下操作:

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

如果在GC.Collect调用后内存没有释放,则可能是缺少入口点引用,或者是图形不完整。

我看不到任何会导致问题的特定内容。思考:
数据库中有多少条目?
tblDepartments
中有多少条记录?请注意,垃圾收集器不一定会在
使用
块结束时立即释放内存(它运行的时间间隔不是很确定)。尝试使用内存分析器,可能会有所帮助;它只是在下次GC运行时标记要收集的对象。如果您在调试模式下运行它,您可能还会看到GC的一些奇怪行为。最后,请注意,如果您的进程没有内存压力,GC可能不会运行——您可能会看到内存膨胀的情况,这实际上不会导致问题。综上所述,>1GB对于一次只使用~5MB的进程来说确实有些奇怪。@PhilSandler:来自“强制所有代立即进行垃圾收集”的文档。例如,
GC.Collect()
确实强制垃圾收集。使用内存分析器的建议也是如此。我注意到
ObjectContext
封装了数据库连接和缓存管理器。即使涉及连接池或某些对象缓存,1GB似乎也太多了,但要确定这两种情况是否会导致问题,最好的方法是使用内存探查器。感谢大家一起思考。大约有360个数据库,因此360*5MB可以肯定地解释1GB。已经做了一个记忆档案,结果是:有什么想法吗?
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();
    }
}