为什么所有堆中的字节都比总内存使用量大得多

时间:2016-05-24 17:52:24

标签: c# memory-leaks windbg

我们有一个C#Windows服务(在Windows 2008服务器上运行+ .NET framework 4.6 + GC perf hotfix)。运行几天后,所有堆中的字节大小超过100 GB(已提交),私有字节也非常高(110 GB +),但RAM使用率仅为68 GB(工作集)& 59 GB(专用字节)。此服务器上的页面文件只有10 GB。

我做了转储并运行WinDbg + SOS来分析内存使用情况,我发现有很多Free个对象(大约54 GB)。这可能是由Free个对象引起的吗?那些免费对象只占用虚拟内存但没有物理内存吗?如果没有,提交的虚拟内存如何比使用的物理内存+页面文件大得多?

1 个答案:

答案 0 :(得分:2)

您刚刚发现了 demand-zero pages 的概念。

让我引用Windows Internals,第6版,第2部分[Amazon Germany],第10章,它是关于内存管理的(本书的第276页):

  

对于其中许多项目,提交费用可能代表存储的潜在用途而非实际用途。例如,私有提交的内存页面实际上并不占用RAM的物理页面或等效的页面文件空间,直到它被引用至少一次。在此之前,它是一个需求零页面 [...]但是,在首次创建虚拟空间时,会为这些页面提交费用。这可确保在以后引用页面时,可以使用实际的物理存储空间。

这意味着:当访问(已提交但未访问/未使用)内存时,Windows将增加工作集或页面文件的大小。

你的判决

  

这些免费对象是否仅占用虚拟内存但没有物理内存?

并不适合其他问题。任何内存,无论它填充什么(.NET Free对象,.NET常规对象甚至C ++),都可能消耗物理内存(然后它在工作集中)或者不是(然后它& #39;在页面文件中。)

相关问题