通过引用(远程),内存泄漏

时间:2018-09-28 03:50:13

标签: c# asp.net-mvc memory-leaks memory-profiling

MVC EF6

嗨,我在任何地方都找不到答案,所以我发布了自己的问题,我试图追踪内存泄漏,我的应用程序中有很多重复的字符串,使用它真的很大,它有很多代码。

我意识到,每次发出请求时,我们都在创建一个新的DB Context实例,但我们从不对其进行处理,因此,请检查我的清单并确保所有内容都得到处理。

请不要发布类似内容,只需执行以下操作即可:

using(var context = new DbContext) {}

我不能这样做,因为应用程序很大,重构将花费很多时间。我认为要做的是创建一个字典,然后在每次请求期间保存上下文,如下所示(全局asax):

protected void Application_EndRequest(object sender, EventArgs e)
  {
     if (User != null && User.Identity.IsAuthenticated)
     {
        ContextConfig.Dispose(Context.Items["UniqueRequestId"].ToString());
     }
  }

  protected void Application_BeginRequest(Object sender, EventArgs e)
  {
     //Creating Unique Request ID
     Context.Items["UniqueRequestId"] = Guid.NewGuid().ToString();
  }

在这里,我为每个请求创建一个唯一的ID,然后最后处理在该请求期间创建的所有上下文(是的,我知道每个请求只能包含一个,但是它们确实创建了多个,但最大我见过2,所以我认为还算不错。

这是我的ContextConfig类:

public static class ContextConfig
{
  private static ConcurrentDictionary<string, List<DbContext>> Config = new ConcurrentDictionary<string, List<DbContext>>();

  public static void Add(string key, DbContext context)
  {
     //If contains key then add it, otherwise just create new instance
     if (Config.ContainsKey(key))
     {
        Config[key].Add(context);
     }
     else
     {
        Config[key] = new List<DbContext>();
        Config[key].Add(context);
     }
  }

  public static void Dispose(string key)
  {
     //If contains key and list has context then dispose them. 
     if (Config.ContainsKey(key))
     {
        if (Config[key] != null && Config[key].Count > 0)
           foreach (var context in Config[key])
           {
              context.Dispose();
           }

        Config[key].Clear();  
        ((IDictionary)Config).Remove(key);
     }
    }
   }

此后,我希望我的MemoryLeak问题得到改善,但是我认为这会以某种方式变得更糟,因为由于某些原因,我添加到列表中的实例由垃圾收集器保存,但现在我迷路了。

这是我在内存分析中看到的内容:

enter image description here

这些都是重复的字符串:

enter image description here

编辑:不确定这是否相关,但是在创建新实例时会发生

  context.Configuration.AutoDetectChangesEnabled = true;
     context.Configuration.ProxyCreationEnabled = false;
     context.Configuration.LazyLoadingEnabled = false;

enter image description here

0 个答案:

没有答案