我启动了IIS中托管的MVC应用。打开任务管理器,看到该过程使用大约55 MB。 如果要查看其中一个.net Profiler中的内存使用情况,则会显示
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
答案 0 :(得分:0)
Windows中的内存非常复杂:有许多不同的测量方法。看看here(大约一半)开始。
但是,您可以猜测,探查器使用的57 MB私有字节与任务管理器使用的55 MB相同。搜索Windows内存专用字节(我认为它与我链接到的页面中的私有工作集相同)。
我不知道有关内存组织方式的任何简单摘要。但是,内存中加载的内容多于您使用的简单对象。有你的代码(必须加载或无法运行),有.NET运行时,有堆栈可以跟踪代码中的位置以及当前方法完成时返回的位置,等等等等。如果不会改变某些内存,可以在不同进程之间共享:.NET运行时,您自己的代码(可能)。有些人不会被分享:你的数据,你的筹码。
分配内存不仅仅是"哦,你需要存储一个50字节的字符串 - 就在这里!"。一次分配50个字节效率低下。你的程序将在开始时获取一堆内存(它实际上称为堆),并逐渐使用它。当它全部使用时,它将更多地抓住一堆。我不确定.NET运行时作为默认值 - 可能至少64K但可能更多。正如我所说,它很复杂。
答案 1 :(得分:0)
专用字节是进程分配的页面。这通常用于存储数据。
CLR代表您的托管应用程序分配内存。这反映在私有字节中。这个内存 - 托管堆 - 以块的形式分配。托管应用程序创建存储在托管堆上的对象。除了托管堆之外,CLR还会分配内部使用的内存。这也增加了私有字节。
对象的总大小是当前分配的对象大小的总和。此数字将始终小于专用字节。