2016-04-02 2 views
0

Я контролирую потребление памяти моего программного обеспечения через dotMemory JetBrains.Entity Framework Memory Leak

Я заметил, что когда я делаю запрос через свой репозиторий, то, если я закрою окно, я оставил объект, с которого я сделал вызов; мой репозиторий в память, я использовал и даже распоряжаюсь своим контекстом, но ничего не остается ... в памяти. Что я могу проверить?

Вот код обижая:

LoginViewModel.cs

using (DbContext = new Context()) 
{ 
    var creazioneDocumentoRepository = new RepositoryBase<CreazioneDocumento>(ctx); 
    var creazioneDocumento = creazioneDocumentoRepository.Lista(); 

    if (creazioneDocumento == null || creazioneDocumento.Count == 0) 
     return; 

    var decimaliQuantita = creazioneDocumento.Max(x => x.NumeroDecimaliQuantita); 
    _NumeroDecimaliQuantita = decimaliQuantita != 0 && decimaliQuantita > 0 ? decimaliQuantita : 0; 

    var decimaliPrezzo = creazioneDocumento.Max(x => x.NumeroDecimaliPrezzo); 
    _NumeroDecimaliPrezzo = decimaliPrezzo != 0 && decimaliPrezzo > 0 ? decimaliPrezzo : 3; 
    _NumeroDecimaliImponibile = 2; 

    // ctx.Dispose(); 
} 

Doing отладки, я заметил, что до:

if (creazioneDocumento == null || creazioneDocumento.Count == 0) return; 

объект не вспомнил, но как только Я запускаю «max», объект остается в памяти.

Вот снимок экрана с dotmemory:

enter image description here

Вместо этого скриншот говорит мне, что методы, которые ссылаются и сохранить в памяти моей loginviewmodel, и я считаю, что они являются два макс:

enter image description here

+0

Вы знаете, что вы не доказали утечку памяти в среде GC? Все, что вы доказали, состоит в том, что объекты, которые не являются мусором, собранным YET, не из памяти YET. Перед выполнением второго измерения вы пропустите доказательство работы GC. Голосование закрыто - невозможно воспроизвести. – TomTom

+0

@TomTom Когда dotMemory получает моментальные снимки, он выполняет полную сборку мусора, поэтому, если есть объекты в памяти, это означает, что они удерживаются некоторыми корнями. Brux88: Я вижу, что это не экземпляр LoginViewModel, но экземпляр некоторой лямбды с закрытием хранится в памяти некоторыми другими делегатами. Невозможно сказать что-то еще без исходного кода LoginViewModel. –

+0

На самом деле, как я и думал. но я не понимаю, как освободить память. проблема заключается в том, когда я выполняю эту строку: var decimaliQuantita = creazioneDocumento.Max (x => x.NumeroDecimaliQuantita); ..... как я могу исправить? – Brux88

ответ

0

.NET CLR - это управляемая сборка времени/виртуальная машина, собранная для мусора.

Вы не можете ожидать, что объекты будут восстановлены и удалены из памяти, как только они не понадобятся.

С другой стороны, IDisposable.Dispose - это всего лишь интерфейсный метод определения кода для выпуска базовых ресурсов, используемых реализацией: это не встроенный метод для выпуска памяти.

Сборщик мусора (GC) восстанавливает память как фоновый процесс, и он ничего не удаляет мгновенно, а основан на предположениях сверхурочных.

Дальнейшее чтение: Understanding garbage collection in .NET

+0

Кроме того, с IDisposable.Dispose вы должны быть уверены, что освобождены неуправляемые ресурсы. НО в вашем случае у вас есть соединение с СУБД, которые объединены, поэтому соединение и связанные ресурсы не будут выпущены. Для управляемых объектов, если вы выполняете стресс-тест и профиль памяти, вы, вероятно, увидите пилообразную форму. – bubi

+0

Профилировщик памяти выполняет полную сборку мусора, чтобы получить снимок памяти –