OutOfMemoryException,转储文件大小和GC堆大小

时间:2011-09-28 07:43:40

标签: .net windbg dump

在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会在哪里?

更多细节:

  • 转储文件本身的大小为2.007.000.476字节。
  • 运行该软件的机器只有1GB的物理RAM,但该机器的虚拟内存设置增长到3GB(这样应用程序应该可以增长到最大的1.5GB的32GB。净申请)。

2 个答案:

答案 0 :(得分:1)

最有可能的过程不是3GB。这是一个每个进程设置。

此外,如果您想查看总内存使用量,可以使用!heap -s。这将为您提供每个堆正在执行的操作以及它使用的内存量的摘要。这也将向您展示碎片问题。将此与托管堆结合使用,它可以让您了解总内存使用情况。

答案 1 :(得分:0)

转储大小接近2 Gb表示进程的用户地址空间已满。内存不仅由.Net内存分配填充,还包括本机(C / C ++)分配,jitted代码,二进制文件,堆栈,...... 使用Windbg,使用!address -summary检查虚拟空间使用情况。 要获取全局视图,还可以使用DebugDiag来分析转储。