2

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

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

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

谢谢你。

stacktrace NLog 如何创建 Dictionary

Dictionary 的内存使用情况

NLog 版本:4.7.2

平台:.NET 框架 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;
4

1 回答 1

1

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

从您的屏幕截图中可以看出它是这个集合:

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

字典容量为 10103 个条目。这可能是最接近 10000 的素数。

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

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

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

于 2020-06-19T18:11:28.603 回答