Я борюсь с проблемой памяти, которую я определенно вижу, но не знаю, где и когда именно это происходит.Отладка утечки памяти VS2015. Массивная родная куча
Мое управляемое количество кучи, похоже, в порядке (100 МБ), но размер родной кучи начинает расти в неизвестный момент, и он все еще продолжается, пока он не достигнет ~ 2 ГБ, а приложение рушится.
Мое приложение работает много потоков, и он делает много Db-соединения через EF 6 во многих циклах. Вот почему мне очень сложно отлаживать код, просто просматривая журналы или помещая точки останова.
Я подумал, что, может быть, я могу понять, в чем проблема, если посмотреть на память, но только я вижу, что мой размер кучи в основном заполнен объектами размером 8,192 байт. Поэтому я вижу, что проблема действительно происходит, но до сих пор не имеет понятия, почему.
Я не уверен, использую ли я 100% возможности профилирования памяти Visual Studio.
Что я могу видеть сейчас:
Что еще более или я могу сделать, чтобы найти проблему?
Возможно, это глупый вопрос, но я работаю над этой проблемой в течение двух дней, и я почти достиг предела своих идей.
Я прошел через точки разрыва, журналы, анализ кода, но я все равно не знаю.
Буду благодарен за любую идею.
[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();
}
Вы могли бы попытаться прокомментировать некоторые из ваших петель (поддельные данные, если это необходимо), чтобы попытаться изолировать часть кода, который вызывает проблему. Возможно, вы неправильно распоряжаетесь некоторыми объектами базы данных. –
Если вы знаете Debug Diag, функция отслеживания утечки может легко определить, какая из родных библиотек отвечает за утечку Native. –
@ RenéVogt: Я смог найти этот фрагмент кода. Но это выглядит нормально. Я понятия не имею, что может вызвать проблемы здесь. – Wiktor