0

我启动托管在 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?

部分截图: http : //i.stack.imgur.com/Gr0J2.png http://i.stack.imgur.com/Gr0J2.png

4

2 回答 2

0

Windows 中的内存是一件相当复杂的事情:有许多不同的测量方法。看看这里(大约一半)开始。

但是,您可以猜测分析器使用的 57MB 私有字节与任务管理器使用的 55MB 相同。搜索 Windows 内存私有字节(我认为它与我链接到的页面中的私有工作集相同)。

我不知道任何关于记忆是如何组织的简单总结。但是,加载到内存中的内容不仅仅是您使用的简单对象。有你的代码(必须加载或无法运行),有 .NET 运行时,有堆栈来跟踪你在代码中的位置以及当前方法完成时返回的位置,等等和等等。如果不进行更改,则可以在不同进程之间共享一些内存:.NET 运行时,您自己的代码(可能)。有些不会共享:您的数据,您的堆栈。

分配内存不仅仅是“哦,你需要存储一个 50 字节的字符串 - 在这里!”。一次分配 50 个字节效率低下。你的程序会在开始时抓取一个内存堆(实际上称为堆),然后逐渐用完。当它全部用完时,它会多抓一大堆。我不确定 .NET 运行时默认采用什么 - 至少可能为 64K,但可能更多。正如我所说,这很复杂。

于 2014-12-05T17:02:40.547 回答
0

私有字节是进程分配的页面。这通常用于存储数据。

CLR 代表您的托管应用程序分配内存。这反映在私有字节中。该内存(托管堆)以块的形式分配。托管应用程序创建存储在托管堆上的对象。除了托管堆之外,CLR 还分配它在内部使用的内存。这也增加了私有字节。

对象的总大小是当前分配的对象大小的总和。这个数字总是小于私有字节。

于 2014-12-05T17:21:55.753 回答