C# ObjectContext未被垃圾收集
我们在一个控制台应用程序中运行一个非常简单的函数,该函数在数据库中循环,并将一个表列成一个变量。当然,最初它做的更多,但我们将其简化为清单1 我们注意到,每次新创建C# ObjectContext未被垃圾收集,c#,entity-framework,C#,Entity Framework,我们在一个控制台应用程序中运行一个非常简单的函数,该函数在数据库中循环,并将一个表列成一个变量。当然,最初它做的更多,但我们将其简化为清单1 我们注意到,每次新创建ObjectContext时,内存都会增加大约5MB。对于它,我们有一个using()语句,即使在执行GC.Collect()时,内存也不会被释放 当我们删除表的列表并只创建新的ClassEntities时,内存仍然很低 我们用尽一切办法来破坏和收集,但都没有成功,导致内存使用超过1GB 以下是主要节目: List < stri
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 {}
}
}
任何帮助或想法都将不胜感激。垃圾收集对象有两个条件:
- 它超出了范围
- 它不再在程序的其他地方引用
- 确定构成循环引用对象图的对象引用的完整图
- 识别并确定此图表的入口点
- 清除图形中任何入口点的引用
- 调用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();
}
}