我的 ASP.NET Core 2.2 Web 应用程序在 .NET Framework 4.7.2 上运行,空闲启动后使用超过 220MB+。
220MB 很高 - 因为它在小型 Azure 应用服务计划中运行,我想看看可以采取哪些措施来减少内存使用量。 Visual Studio 的诊断工具窗口显示托管对象堆仅占 220MB 中的 11MB。
对这个解释不满意(另外 209MB 去哪儿了?!)我使用 VMMap 进行了查看,它报告进程的私有(private)字节中的 85MB 是不同的托管堆 - 而不是 Visual Studio 报告的 11MB。
这是屏幕截图:
据我所知,Visual Studio 在内存快照中报告的 11.5MB 堆可能对应于 VMMap 中的第一个子行(使用 11,523 K
的 Gen0
堆) -但是其他类似大小的堆(10.3MB、9.9MB、9.4MB、9.0MB、5.7MB)呢?这些堆里面有什么,为什么 VS 不报告它们?如果它们与应用程序无关,那么当进程没有在调试器下运行时,为什么进程的内存使用率如此之高?
最佳答案
经过一些研究 - 我找到了解释大部分堆的解释:
默认情况下,ASP.NET Core 程序使用“服务器”GC 系统运行,该系统为每个处理器核心创建一个单独的托管堆实例 - 并且所有这些堆都映射到单个逻辑托管堆。
所以 11.5MB 堆大小是正确的 - 但这意味着我的计算机上有六个 11.5MB 堆:每个处理器核心一个(尽管它们的大小实际上不是 11.MB - 它们足够接近:10.3MB, 9.9MB、9.4MB、9.0MB、5.7MB - 因为在这些特定于核心的堆中放置的对象较少)
这在本页中有所解释:https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals - 查找标题“工作站和服务器垃圾收集”。
不过 - 我没想到会这样。我希望在我的 app.config
中有类似信息丰富的 XML 注释之类的东西。/web.config
-由 Visual Studio 生成的文件,它实际放置 <gcServer enabled="true" />
在默认项目模板中。
关于memory - Visual Studio 不会显示的其他托管堆内有什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57684535/