【问题标题】:What is inside the other managed-heaps that Visual Studio won't display?Visual Studio 不会显示的其他托管堆内部有什么?
【发布时间】:2020-01-01 05:12:16
【问题描述】:

我的 ASP.NET Core 2.2 Web 应用程序在 .NET Framework 4.7.2 上运行,空闲时启动后使用超过 220MB+。

220MB 很高 - 因为它在小型 Azure 应用服务计划中运行,所以我想看看可以采取哪些措施来减少内存使用量。 Visual Studio 的诊断工具窗口显示托管对象堆仅占 220MB 中的 11MB。

对该解释不满意(其他 209MB 去哪儿了?!)我使用 VMMap 进行查看,它报告 85MB 进程的私有字节是不同的托管堆 - 而不是 Visual Studio 报告的 11MB。

截图如下:

我知道 Visual Studio 在内存快照中报告的 11.5MB 堆可能对应于 VMMap 中的第一个子行(使用 11,523 KGen0 堆) - 但是其他类似大小的堆呢( 10.3MB, 9.9MB, 9.4MB, 9.0MB, 5.7MB) - 里面有什么,为什么 VS 不报告它们?如果它们与应用程序无关,那么为什么进程的内存使用率在它在调试器下运行时会如此之高?

【问题讨论】:

    标签: memory heap-memory managed vmmap


    【解决方案1】:

    经过一些研究 - 我找到了解释大多数堆的解释:

    默认情况下,ASP.NET Core 程序使用“服务器”GC 系统运行,该系统为每个处理器核心创建一个单独的托管堆实例 - 所有这些堆都映射到一个逻辑托管堆。

    所以 11.5MB 堆大小是正确的 - 但这意味着我的计算机上有六个 11.5MB 堆:每个处理器内核一个(尽管它们的大小实际上不是 11.MB - 它们足够接近:10.3MB, 9.9MB、9.4MB、9.0MB、5.7MB - 因为在这些特定于核心的堆中放置的对象更少)

    这是有点在此页面中解释的:https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals - 查找标题“工作站和服务器垃圾收集”。

    仍然 - 我没想到会这样。我希望在 Visual Studio 生成的 app.config/web.config 文件中提供类似信息性 XML 注释,它实际上将 <gcServer enabled="true" /> 放在默认项目模板中。

    【讨论】:

      猜你喜欢
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 2014-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多