32位池和64位池之间的内存使用情况

jis*_*shi 21 .net asp.net nhibernate memory-management iis-7.5

我们有一个围绕MonoRail和NHibernate构建的ASP.NET应用程序,我注意到在使用64位模式或32位模式运行它时会出现奇怪的行为.所有内容都编译为AnyCPU,并且在两种模式下运行良好,但内存使用情况有很大差异.

查看ANTS的以下快照:

32bit_snapshot: 在此输入图像描述

VS

64bit_snapshot: 在此输入图像描述

两个快照的使用场景几乎相同(我在两次运行中都点击了相同的页面).

首先,为什么未使用的内存在64位模式下如此之高?为什么非托管内存在64位模式下的大小是4倍?

任何有关这方面的见解都会非常有帮助.

CIG*_*Guy 15

64位进程的初始内存分配远远高于等效32位进程的内存分配.

理论上,这允许垃圾收集运行得更少,这应该提高性能.它还有助于碎片化,因为一次分配更大的内存块.

本文:http://blogs.msdn.com/b/maoni/archive/2007/05/15/64-bit-vs-32-bit.aspx给出了更详细的解释.

您看到的非托管内存使用率较高可能是因为在32位模式下运行的.NET对象使用最少12个字节(8个字节+ 4个字节引用),而64位中的同一个对象需要24个字节(12个字节+ 8字节参考).

另一篇文章更完整地解释了这一点:http://www.simple-talk.com/dotnet/.net-framework/object-overhead-the-hidden-.net-memory--allocation-cost/


Pet*_*ter 2

我无法告诉你到底发生了什么,但大概可以猜测一下。32 位进程具有与 64 位进程不同的内存限制。CLR会经常在32位进程中运行GC。您可以通过图表上的尖峰看到这一点。然而,当您运行 64 位进程时,直到内存不足时才会调用 GC。这将取决于系统的总内存使用情况。

从数字上看,32位进程只能分配大约1gig,而64位进程可以分配所有内存。在 32 位进程中,GC 会更快地开始清理,因为当程序使用过多内存时,性能会受到影响。当您的总系统内存降至某个垃圾箱以下时,64 位进程上的 CLR 将开始清理。