NLog: класс ObjectReflectionCache всегда инициализирует объект MruCache с огромной емкостью - PullRequest
2 голосов
/ 19 июня 2020

Я разрабатываю приложение WPF, которое использует NLog.

Когда я профилирую его с помощью dotMemory , я вижу ~ 300 КБ памяти, используемой словарем, который NLogs создает во время настройки.

Я не знаю, какие объекты ObjectReflectionCache и MruCache используются для определения того, будет ли их память когда-нибудь освобождена. Может быть, кто-нибудь сможет прояснить назначение классов и огромную емкость, используемую для словаря.

Спасибо.

stacktrace, как NLog создает словарь

использование памяти словаря

Версия NLog : 4.7.2

Платформа :. NET Framework 4.6.1

Текущая конфигурация NLog

LoggingConfiguration config = new LoggingConfiguration();
DebuggerTarget debuggerTarget = new DebuggerTarget { Name = "vs", Layout = DebuggerLayout };
DebuggerLoggingRule = new LoggingRule(nlogLoggerNamePattern, debuggerTarget);
config.LoggingRules.Add(DebuggerLoggingRule);
LogManager.Configuration = config;

1 Ответ

1 голос
/ 19 июня 2020

Снимаю шляпу перед тем, кому небезразличны 300 КБайт. Долгое время я не уделял внимания накладным расходам такого размера (но все же важно).

Из вашего скриншота видно, что это эта коллекция:

https://github.com/NLog/NLog/blob/29879ece25a7d2e47a148fc3736ec310aee29465/src/NLog/Internal/Reflection/ObjectReflectionCache.cs#L52

Объем словаря - 10103 словарных статей. Это, вероятно, простое число, наиболее близкое к 10000.

Я предполагаю, что размер Tkey + TValue словаря близок к 30 байтам. Это дает общий результат 300 КБайт, хотя, вероятно, не используется. Предположим, что NLog может уменьшить свои начальные накладные расходы, не выделяя заранее 300 КБайт.

Словарь используется для кэширования отражения объектов для типов объектов, регистрируемых для использования в структурированном журналировании. До NLog 4.7 словарь выделялся только при фактическом ведении структурированного журнала, но это изменилось с помощью https://github.com/NLog/NLog/pull/3610

Обновление Объем памяти был уменьшен с помощью NLog ver. 4.7.3

...