gpt4 book ai didi

c# - ObjectContext 未被垃圾收集

转载 作者:行者123 更新时间:2023-11-30 12:59:06 27 4
gpt4 key购买 nike

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

如有任何帮助或想法,我们将不胜感激。

最佳答案

一个对象被垃圾回收有两个条件:

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

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

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

尝试以下操作:

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

如果内存在 GC.Collect 调用后没有被释放,要么是你缺少的入口点引用已清除,要么是你的图表不完整。

关于c# - ObjectContext 未被垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27067968/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com