相关疑难解决方法(0)

.NET 进程的内存转储中有大量无法解释的内存

我无法解释 C# 进程使用的大部分内存。总内存为 10 GB,但总可达和不可达对象总计为 2.5 GB。我想知道这些 7.5 GB 可能是什么?

我正在寻找最可能的解释或方法来找出这种记忆是什么。

这是确切的情况。进程是.NET 4.5.1。它从互联网下载页面并使用机器学习处理它们。内存几乎完全在托管堆中,如 VMMap 所示。这似乎排除了非托管内存泄漏。 在此处输入图片说明

这个过程已经运行了几天,内存慢慢增长。在某些时候,内存为 11 GB。我停止在这个过程中运行的一切。我多次运行垃圾收集,包括大对象堆压缩(间隔一分钟):

GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();
Run Code Online (Sandbox Code Playgroud)

内存下降到 10 GB。然后我创建转储:

procdump -ma psid

正如预期的那样,转储为 10 GB。

我使用.NET 内存分析器(5.6 版)打开转储。转储显示总共 2.2 GB 可访问对象和 0.3 GB 不可访问对象。剩下的 7.5 GB 可以解释什么?

我一直在想的可能解释:

  • LOH 并没有真正被完全压实
  • 一些内存使用超出了分析器显示的对象

c# memory-profiling large-object-heap

4
推荐指数
1
解决办法
1391
查看次数

标签 统计

c# ×1

large-object-heap ×1

memory-profiling ×1