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();
}
}
任何帮助或想法将不胜感激。
垃圾
回收对象有 2 个条件:
- 它超出了范围
- 它在程序的其他地方不再被引用
正如截屏视频所示,您有循环引用来阻止预期的垃圾回收。
您的项目列表引用了连接,而连接又引用了您的项目(HorekoEntitiesNoLog)
请尝试以下操作:
- 确定构成循环引用对象图的对象引用的完整图形。
- 标识和此图的入口点。
- 清除图形任何入口点的引用。
- 调用 GC。收集()。
如果 GC 后未释放内存。收集调用,要么您缺少入口点引用清除,要么您的图形不完整。