NLog: ObjectReflectionCache class 总是初始化一个容量巨大的MruCache对象

NLog: ObjectReflectionCache class always initializes a MruCache object with huge capacity

我开发了一个使用 NLog 的 WPF 应用程序。

当我使用 dotMemory 对其进行分析时,我可以看到 NLogs 在配置期间创建的字典使用了约 300k 的内存。

我不知道ObjectReflectionCache 和MruCache 是做什么用的,它们的内存是否会在某个时间被释放。也许有人可以阐明 类 的用途以及字典所用的巨大容量。

谢谢。

stacktrace how NLog creates Dictionary

memory usage of Dictionary

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;

为关心 300 KB 的人脱帽致敬。很久以来我一直关注这种规模的开销(但仍然很重要)。

从你的截图来看是这个合集:

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

词典容量为10103条。这可能是最接近 10000 的质数。

我猜 Dictionary 的 Tkey + TValue 的大小接近 30 字节。这给出了 300 KB 的总结果,尽管可能未使用。猜测 NLog 可以通过不预先分配 300 KB 来减少其初始开销。

该字典用于缓存对象反射,以记录用于结构化日志记录的对象类型。在 NLog 4.7 之前,字典仅在实际进行结构化日志记录时分配,但这随着 https://github.com/NLog/NLog/pull/3610

发生了变化

更新 NLog 版本减少了内存占用。 4.7.3