memory - Visual Studio 不会显示的其他托管堆内有什么?

标签 memory heap-memory managed vmmap

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

enter image description here

最佳答案

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

默认情况下,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/

相关文章:

c++ - 我们需要为 gcnew 创建指针验证吗

C++/g++ : How does the compiler handle memory-allocation in this situation?

java - 获取内存不足的堆空间错误 - 如何使用 Java 堆内存

堆栈中的 C++ 类对象作为 Map 的值插入

.NET - clr.dll 和 native 堆的高内存使用率

c# - VB.Net - 检查文件是否为 .net 二进制文件

Java应用程序内存大小

c++ - 获取 C# 输出字符串参数值到 C++ BSTR*?

jsf - 一个jsf页面和一个托管bean之间,为什么getter方法被调用了两次

java - 用Java在平面文件中记录操作