gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:48:59 25 4
gpt4 key购买 nike

我们有一个 C# Windows 服务(在 Windows 2008 服务器 + .NET Framework 4.6 + GC perf hot fix 上运行)。运行几天后,所有堆的字节大小都达到100多GB(已提交),私有(private)字节也很高(110 GB+),但RAM使用率只有68 GB(Working Set)和59 GB(专用字节)。此服务器上的页面文件只有 10 GB。

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

最佳答案

您刚刚发现了零需求页面的概念。

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

For many of those items, the commit charge may represent the potential use of storage rather than the actual. For example, a page of private committed memory does not actually occupy either a physical page of RAM or the equivalent page file space until it's been referenced at least once. Until then, it's a demand-zero page [...] But commit charge accounts for such pages when the virtual space is first created. This ensures that when the page is later referenced, actual physical storage space will be available for it.

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

你的句子

Do those free objects only take up virtual memory but no physical memory?

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

关于c# - 为什么所有堆中的字节数比总内存使用量大得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37420595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com