Несколько объектов в StateManager Entity Framework, потребляющих огромное количество оперативной памяти - PullRequest
0 голосов
/ 05 июля 2019

В настоящее время я работаю над разработкой новых функций в приложении, которое используется для распределения игр между серверами.Приложение представляет собой приложение .Net Core 2.0, работающее под управлением EF Core 2.0.0.Проблема в том, что Entity Framework выделяет огромное количество памяти.Я использовал dotMemory для устранения неполадок, и он показывает, что источником выделения памяти является Microsoft.EntityFrameworkCore.Internal.StateManager.Увеличение памяти является довольно линейным, поскольку это читает данные.В конце концов, память, выделенная приложением, заполняет всю доступную память сервера Windows, в данном случае 12 ГБ, вызывая ошибки в других службах.Кажется, что объекты в LOH никогда не собираются мусором, а просто продолжают расти, пока память не заполнится полностью.Мне кажется очень странным, что выделяется столько данных.Я знаю, что можно сохранить данные в файл на диске, а затем освободить память, но мне интересно, действительно ли это необходимо или есть какое-то лучшее решение этой проблемы.

Несколько изображенийиз устранения неполадок в dotMemory:

Image1: https://i.ibb.co/YXZJ0dY/memory-problem1.jpg

Image2: https://i.ibb.co/YRMTfMF/memory-problem2.jpg

Перемещение файлов является основной функцией приложения, архитектура приложениядовольно слоистый, поэтому структура становится довольно сложной.Поэтому я попытался совместить решение этой проблемы с написанием дополнительных модульных и интеграционных тестов.Мне удалось воссоздать сценарий, когда память заполняется, и объекты попадают в LOH.Я использовал объект производственных данных, который зацикливаю и добавляю в базу данных в памяти.Но даже если я клонирую эту сущность 10000 раз, я не получаю более 1 ГБ ОЗУ (что ожидается, поскольку одна сущность составляет около 8 МБ), но это далеко проблема в работе.Так что меня интересует, действительно ли отслеживание состояния объекта может потреблять столько памяти?Это другая компания, предоставляющая решение, поэтому я не хочу отправлять им новую версию, не найдя причину проблемы, но воссоздать точную проблему довольно сложно.Я попытался добавить AsNoTracking () в модульный тест, но это не сильно повлияло на распределение памяти (что заставляет меня задуматься, потому что это база данных в памяти?).

Так что я в основноминтересно, если государство это вся проблема?И как лучше всего воссоздать подобную проблему?

1 Ответ

0 голосов
/ 05 июля 2019

Это может быть вызвано тем, что MARS не активирован в строке подключения. Эта проблема, зарегистрированная с командой EF Core, подтверждает, что это может быть проблемой: https://github.com/aspnet/EntityFrameworkCore/issues/14640

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...