在32位计算机上运行的32位.net应用程序遇到了OutOfMemoryException。然后我进行了完整的内存转储,尽管使用WinDbg我可以验证是否正在使用大量内存,但我想知道为什么我们会得到OOME,尽管根据WinDbg输出到“!eeheap -gc”的GC堆大小,只有大约1GB,所以看起来还有相当大的空间留给1.5GB的.net。
以下是输出的部分内容:
0:000> !eeheap -gc
Number of GC Heaps: 1
generation 0 starts at 0x6a12ffcc
generation 1 starts at 0x6a12ffc0
generation 2 starts at 0x016a1000
ephemeral segment allocation context: (0x6a12ffd8, 0x6a12ffe4)
segment begin allocated size
016a0000 016a1000 0269ff64 0x00ffef64(16772964)
...
69130000 69131000 6a12ffd8 0x00ffefd8(16773080)
Large object heap starts at 0x026a1000
segment begin allocated size
026a0000 026a1000 03698a98 0x00ff7a98(16743064)
...
70020000 70021000 70a7d750 0x00a5c750(10864464)
Total Size 0x3c67abb4(1013427124)
------------------------------
GC Heap Size 0x3c67abb4(1013427124)
这是预期的吗?剩下的~500MB会在哪里?
更多细节:
答案 0 :(得分:1)
最有可能的过程不是3GB。这是一个每个进程设置。
此外,如果您想查看总内存使用量,可以使用!heap -s。这将为您提供每个堆正在执行的操作以及它使用的内存量的摘要。这也将向您展示碎片问题。将此与托管堆结合使用,它可以让您了解总内存使用情况。
答案 1 :(得分:0)
转储大小接近2 Gb表示进程的用户地址空间已满。内存不仅由.Net内存分配填充,还包括本机(C / C ++)分配,jitted代码,二进制文件,堆栈,...... 使用Windbg,使用!address -summary检查虚拟空间使用情况。 要获取全局视图,还可以使用DebugDiag来分析转储。