@artshelom

Как исправить утечку памяти при работе с EF?

Запустил сервис, который работает по циклу. Но появилась проблема, что кол-во потребляемой памяти только растет.
while (!stoppingToken.IsCancellationRequested)
{
    var countPayments = db.Payments.Where(a => a.TypePayment == Data.Payments.TypePayment.Activity).Count();
    foreach (var payment in checkPayments)
    {
        var payment = db.Payments.Where(a => a.TypePayment == Data.Payments.TypePayment.Activity).OrderBy(a => a.Id).Skip(i)
            .Take(1).Include(a => a.Subscription).Include(a => a.Promocodes).FirstOrDefault();
        var telegramUser = db.TelegramUsers.Where(a => a.Id == payment.TelegramUserId).FirstOrDefault();

        if (payment == null || telegramUser == null)
            continue;

        try
        {
            CheckBlaBla(payment, telegramUser );
        }
        catch (Exception e)
        {
            throw e;
        }
        payment = null;
        telegramUser = null;
        GC.Collect();
        GC.WaitForPendingFinalizers();
    }
}

Обычный сервис BackgroundService.
Если принудительно очищаю как ниже все становится вроде хорошо. Но немного не понимаю. Почему после потери ссылки, не удаляются из памяти (как в дебаге, так и в релизе). Какие ограничения можно поставить в конфиге? или только так с этим бороться?
payment = null;
telegramUser = null;
GC.Collect();
GC.WaitForPendingFinalizers();
  • Вопрос задан
  • 460 просмотров
Решения вопроса 1
vabka
@vabka Куратор тега ASP.NET
Токсичный шарпист
1. Кучу памяти сжирает change tracker в EF, так что первым шагом его отключаем, добавляя AsNoTracking к каждому запросу.
А там где действительно нужно отcлеживать изменения - отсоединяем объекты, когда они не нужны при помощи Detach
2. Включаем ServerGarbageCollection, чтобы сборщик мусора мог работать в несколько потоков
3. Заменяем синхронные вызовы EF на асинхронные.
По идее тоже должно немного помочь
4. Вытаскиваем объекты из базы не по одному, а пачками штук по 100, тк GC проще работать с большими кусками, чем с маленькими
5. Если я правильно понимаю, это у вас HostedService.
В таком, случае смотрите внимательно на использование контекста, тк ещё в другом месте может Change Tracker нагружаться
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Aboba45849894855
@Aboba45849894855
Программист
Документацию можно прочитать здесь: Ссылка
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы