В настоящее время я работаю над разработкой новых функций в приложении, которое используется для распределения игр между серверами.Приложение представляет собой приложение .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 () в модульный тест, но это не сильно повлияло на распределение памяти (что заставляет меня задуматься, потому что это база данных в памяти?).
Так что я в основноминтересно, если государство это вся проблема?И как лучше всего воссоздать подобную проблему?