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/
我无法告诉你到底发生了什么,但大概可以猜测一下。32 位进程具有与 64 位进程不同的内存限制。CLR会经常在32位进程中运行GC。您可以通过图表上的尖峰看到这一点。然而,当您运行 64 位进程时,直到内存不足时才会调用 GC。这将取决于系统的总内存使用情况。
从数字上看,32位进程只能分配大约1gig,而64位进程可以分配所有内存。在 32 位进程中,GC 会更快地开始清理,因为当程序使用过多内存时,性能会受到影响。当您的总系统内存降至某个垃圾箱以下时,64 位进程上的 CLR 将开始清理。
| 归档时间: |
|
| 查看次数: |
4396 次 |
| 最近记录: |