我无法解释C#进程使用的大部分内存。总内存为10GB,但所有可达和不可达对象总共只有2.5GB。我想知道这7.5GB可能是什么?
我正在寻找最有可能的解释或一种查找此内存的方法。
以下是具体情况。该进程是.NET 4.5.1。它从互联网下载页面并使用机器学习进行处理。根据VMMap显示,内存几乎完全在托管堆中。这似乎排除了非托管内存泄漏。
该进程已运行数天,内存逐渐增长。某个时刻,内存为11GB。我停止了进程中的所有运行,并多次运行垃圾回收,包括大对象堆压缩(间隔一分钟):
我正在寻找最有可能的解释或一种查找此内存的方法。
以下是具体情况。该进程是.NET 4.5.1。它从互联网下载页面并使用机器学习进行处理。根据VMMap显示,内存几乎完全在托管堆中。这似乎排除了非托管内存泄漏。
![enter image description here](https://istack.dev59.com/YHSRt.webp)
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();
内存降至10 GB。然后我创建了转储:
procdump -ma psid
预期的转储为10 GB。
我使用.NET memory profiler(版本5.6)打开了该转储。 转储显示总共有2.2 GB可达对象和0.3 GB不可达对象。什么可以解释剩余的7.5 GB?
我一直在思考可能的解释:
- LOH没有真正完全压缩
- 某些内存用于超出分析器显示的对象