我们在控制台应用程序中运行一个非常简单的函数,它循环遍历数据库并将表列入变量。当然最初它做得更多,但我们把它剥离到只列出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();
}
}
非常感谢任何帮助或想法。
答案 0 :(得分:0)
对象有两个垃圾收集条件:
当您的截屏视频显示您有循环引用时,会阻止预期的垃圾回收。
您的商品列表是引用连接,反过来引用您的商品(HorekoEntitiesNoLog)
尝试以下方法:
如果在GC.Collect调用后内存未被释放,则表示您缺少入口点引用清除或图表未完成。