2017-02-03 4 views
-1

Я борюсь с проблемой памяти, которую я определенно вижу, но не знаю, где и когда именно это происходит.Отладка утечки памяти VS2015. Массивная родная куча

Мое управляемое количество кучи, похоже, в порядке (100 МБ), но размер родной кучи начинает расти в неизвестный момент, и он все еще продолжается, пока он не достигнет ~ 2 ГБ, а приложение рушится.

Мое приложение работает много потоков, и он делает много Db-соединения через EF 6 во многих циклах. Вот почему мне очень сложно отлаживать код, просто просматривая журналы или помещая точки останова.

Я подумал, что, может быть, я могу понять, в чем проблема, если посмотреть на память, но только я вижу, что мой размер кучи в основном заполнен объектами размером 8,192 байт. Поэтому я вижу, что проблема действительно происходит, но до сих пор не имеет понятия, почему.

Я не уверен, использую ли я 100% возможности профилирования памяти Visual Studio.
Что я могу видеть сейчас: Snapshot of Native Heap

Что еще более или я могу сделать, чтобы найти проблему?

Возможно, это глупый вопрос, но я работаю над этой проблемой в течение двух дней, и я почти достиг предела своих идей.

Я прошел через точки разрыва, журналы, анализ кода, но я все равно не знаю.

Буду благодарен за любую идею.

[EDIT] 15:11 2017/02/03

Я был в состоянии найти код, отвечающий за утечку, но она по-прежнему не имеет никакого смысла для меня. Как возможно, что этот код вызывает массивную утечку памяти?

Код:

public class DbData : IDisposable 
{ 
    private DBEntity db; 

    public DbData() 
    { 
     db = new FruitDBEntity(); 
    } 

    public Fruit AddFruitDefinition(Fruit fruit) 
    { 
     lock (thisLock) 
     { 
      var newFruit = db.Fruits.Where(f => f.FruitId  == fruit.FruitId) 
            .Where(f => f.FruitName == fruit.FruitName) 
            .Where(f => f.FruitColor == fruit.FruitColor) 
            .FirstOrDefault(); 
      if (newFruit == null) 
      { 
       newFruit = db.Fruits.Add(fruit); 
       db.SaveChanges(); 
      } 
      return newFruit; 
     } 
    } 
} 

Класс DbData создается каждый раз, когда я хочу использовать метод AddFruitDefinition():

using (var data = new DbData()) 
{ 
    data.AddFruitDefinition(); 
} 
+1

Вы могли бы попытаться прокомментировать некоторые из ваших петель (поддельные данные, если это необходимо), чтобы попытаться изолировать часть кода, который вызывает проблему. Возможно, вы неправильно распоряжаетесь некоторыми объектами базы данных. –

+0

Если вы знаете Debug Diag, функция отслеживания утечки может легко определить, какая из родных библиотек отвечает за утечку Native. –

+0

@ RenéVogt: Я смог найти этот фрагмент кода. Но это выглядит нормально. Я понятия не имею, что может вызвать проблемы здесь. – Wiktor

ответ

1

Первое, что вам нужно, по крайней мере два снимка. Насколько я вижу (из изображения) вы сделали только один снимок.

Что делать?

  1. Запустить приложение с профайлером.

  2. Сделайте обычные шаги и сделайте снимок.

  3. Повторите те же действия, которые вы сделали на шаге 2, и сделайте еще один снимок.
  4. Остановить применение. Вы должны увидеть 2 моментальных снимка, щелкнуть на снимке 2ns и выбрать Compare to #Snapshot 1. Для обработки результатов может потребоваться некоторое время.
  5. Вы должны иметь возможность видеть несколько дополнительных столбцов в отчете (Идентификатор, счетчик, Размер, Модуль, Count Diff. Размер Diff. Последние две колонки важны.Они рассказывают, какой класс использовал больше/меньше памяти во второй раз.

Подводя итог ... вам нужно выяснить, где утечка памяти и исправить ее. И вы сделаете это, сравнив снимки.

enter image description here

+0

Спасибо! Как вы уже сказали, теперь я могу проверить различия между этими двумя моментальными снимками, но, к сожалению, я вижу эти различия только как «Неразрешенные распределения». Без каких-либо ссылок на что-либо. Я ничего не могу найти об этом «Неразрешенные распределения». – Wiktor

Смежные вопросы