我无法解释 C# 进程使用的大部分内存。总内存为 10 GB,但可访问和不可访问对象的总数为 2.5 GB。我想知道这些 7.5 GB 可能是什么?
我正在寻找最可能的解释或方法来找出这个记忆可能是什么。
这是确切的情况。该过程是.NET 4.5.1。它从互联网下载页面并使用机器学习对其进行处理。如 VMMap 所示,内存几乎完全位于托管堆中。这似乎排除了非托管内存泄漏。
该过程已经运行了几天,内存慢慢增长。在某些时候,内存为 11 GB。我停止了该过程中运行的一切。我多次运行垃圾收集,包括大型对象堆压缩(间隔一分钟):
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();
内存下降到 10 GB。然后我创建转储:
procdump -ma psid
正如预期的那样,转储为 10 GB。
我使用.NET 内存分析器(5.6 版)打开转储。转储显示总共 2.2 GB 可达对象和 0.3 GB 不可达对象。什么可以解释剩余的 7.5 GB?
我一直在考虑的可能解释:
- LOH 并没有真正被完全压缩
- 超出分析器显示的对象使用了一些内存