После некоторого исследования с помощью DotMemory я увидел, что у меня есть большой пик использования памяти через ServiceProviderCache. Когда я пытаюсь использовать Google ServiceProviderCache EF Core
, я обнаружил следующую ссылку .
В моей ситуации проблема заключалась в том, что я включил локальное ведение журнала консоли, чтобы облегчить обнаружение проблем с ядром ef после миграции. DbContext выглядит так:
private readonly ILoggerFactory _loggerFactory;
public MyContext(DbContextOptions<MyContext> options)
: base(options)
{
_loggerFactory = LoggerFactory.Create(b => b.AddConsole());
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
if (``it is a local run``)
{
optionsBuilder
.UseLoggerFactory(_loggerFactory)
.EnableSensitiveDataLogging();
}
}
проблемные c строки были:
public MyContext(DbContextOptions<MyContext> options)
: base(options)
{
_loggerFactory = LoggerFactory.Create(b => b.AddConsole());
}
На основе ответа на GitHub регистратор создавался каждый раз, когда создавался DbContext и после этого он не был уничтожен. Решением было бы иметь регистратор stati c. Поэтому я реорганизовал его следующим образом:
Создать ConsoleLogger:
public class ConsoleLogger
{
public readonly ILoggerFactory Instance;
public ConsoleLogger()
{
Instance = Microsoft.Extensions.Logging.LoggerFactory.Create(x => x.AddConsole());
}
}
Зарегистрируйте его как синглтон:
...
builder.RegisterType<ConsoleLogger>().AsSelf().SingleInstance();
...
и используйте его в DbContext следующим образом:
public MyContext(DbContextOptions<MyContext> options, ConsoleLogger consoleLogger)
: base(options) =>
_consoleLogger = consoleLogger;
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
if (``it is a local run``)
{
optionsBuilder
.UseLoggerFactory(_consoleLogger.Instance)
.EnableSensitiveDataLogging();
}
}
Благодаря вышесказанному диаграмма профилирования памяти выглядит следующим образом:
до этого: ![enter image description here](https://i.stack.imgur.com/Rvka8.png)