我启动托管在IIS中的MVC应用程序。打开任务管理器,看到该进程使用大约 55 MB。如果要在其中一个 .net 探查器中检查内存使用情况,则会显示
Total sizes of objects : 1.93MB
Memory allocated for .NET app: 17.46
Private Bytes : 57MB
这个值是什么意思?为什么使用 1.93MB 对象的应用会分配大约 55 MB 的 RAM?
一些截图:https://i.stack.imgur.com/Gr0J2.pnghttps://i.stack.imgur.com/Gr0J2.png
Windows中的内存是一件相当复杂的事情:有许多不同的测量方法。首先看看这里(大约一半(。
但是,您可以猜测探查器使用的 57MB 专用字节与任务管理器使用的 55MB 相同。搜索Windows内存专用字节(我认为它与我链接到的页面中的专用工作集相同(。
我不知道有什么关于记忆是如何组织的简单总结。但是,除了您正在使用的简单对象之外,还有更多加载到内存中。有你的代码(必须加载或无法运行(,有 .NET 运行时,有堆栈来跟踪你在代码中的位置以及当前方法完成后返回的位置,等等。如果不打算更改,则可以在不同进程之间共享一些内存:.NET 运行时、您自己的代码(可能(。有些不会共享:您的数据,您的堆栈。
分配内存不仅仅是"哦,你需要存储一个 50 字节的字符串 - 你来了!一次分配 50 个字节效率低下。你的程序会在开始时获取一堆内存(它实际上称为一堆(,然后逐渐用完它。当它全部使用时,它会抓住更多。我不确定 .NET 运行时默认采用什么 - 可能至少 64K,但很可能更多。正如我所说,这很复杂。
专用字节是进程分配的页。这通常用于存储数据。
CLR 代表托管应用程序分配内存。这反映在专用字节中。此内存(托管堆(按块分配。托管应用程序创建存储在托管堆上的对象。除了托管堆之外,CLR 还分配它在内部使用的内存。这也会增加专用字节。
对象的总大小是当前分配的对象的大小之和。此数字将始终小于专用字节。