1

我的 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 中的第一个子行(Gen0使用 的堆11,523 K) - 但是其他类似大小的堆(10.3MB、9.9MB、9.4MB、 9.0MB, 5.7MB) - 里面有什么,为什么 VS 不报告它们?如果它们与应用程序无关,那么当进程不在调试器下运行时,为什么进程的内存使用率如此之高?

在此处输入图像描述

4

1 回答 1

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 - 查找标题“工作站和服务器垃圾收集”。

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

于 2019-09-09T10:36:30.807 回答