EF DbContext память не освобождена - PullRequest
1 голос
/ 20 января 2020

Я не могу освободить про c память, используемую моим EF DbContext. Несмотря на утилизацию и G C .Collect, мое приложение не освобождает память.

Я создал небольшую программу:

static void Main(string[] args)
{

    var test = new TestDb();
    System.Threading.Thread.Sleep(1000);

    // Here proc memory = 7 Mo

    test.Fill();
    System.Threading.Thread.Sleep(1000);

    // Here proc memory = 58 Mo

    test.Dispose();
    System.Threading.Thread.Sleep(1000);

    // Here proc memory = 37.8 Mo

    test = null;
    GC.Collect();

    // Here proc memory = 37.8 Mo
    // Why is not 0 here ???

    System.Threading.Thread.Sleep(1000);
}

Вы можете показать использование памяти с моими комментариями.

TestDb Класс:

 public class TestDb : IDisposable
{
    private List<TaskAction> _actions;

    public void Fill()
    {
        using (var entities = new myEntities())
        {
            entities.Configuration.LazyLoadingEnabled = false;
            _actions = entities.TaskActions.ToList();
        }
    }

    public void Dispose()
    {
        _actions = null;
        GC.Collect();
    }
}

Как мне освободить всю использованную память ??

Спасибо,

Чарли

1 Ответ

2 голосов
/ 20 января 2020

Если мы просто сосредоточимся на памяти данных: среда выполнения не возвращает память обратно ОС, если нет веской причины; если вы только что использовали {некоторое количество памяти}, есть очень хороший шанс, что вы будете использовать это снова через мгновение, и это будет намного более эффективным, чтобы держать его для какое-то время. GC.Collect имеет дело только с внутренним бухгалтерским учетом, так что в ближайшее время ему не нужно запрашивать больше памяти из ОС. Есть вещи, которые вы можете сделать, чтобы сделать среду выполнения более агрессивной при возврате памяти, но ... 37Mb - это, по сути, ничто.

Кроме того, все равно требуется память для внутренних. NET бит (введите метаданные, все загруженные вами сборки, JIT, IL, et c). Выполнение чего-либо, чего-либо с EF (или любой другой библиотекой) приведет к увеличению ie некоторой памяти в процессе, который не будет освобожден . И поскольку вы общались с базой данных, возможно, теперь существует пул соединений (управляемый и неуправляемый) и некоторые SQL связанные потоки.

...