崩溃转储中过多的第2代免费区块

时间:2015-04-03 14:35:20

标签: memory-leaks out-of-memory clr windbg memory-fragmentation

在检查崩溃转储文件以查找客户端报告的内存不足异常时,!DumpHeap -stat的结果显示,45,000个类型的对象正在占用575MB内存,而#34; Free"由于尺寸的原因,我认为其中大部分都必须驻留在Gen 2中。

我寻找问题的第一个地方是大对象堆(LOH)和固定对象。包含可用空间的大对象堆只有70MB,因此问题并没有显示出来!gchandles

GC Handle Statistics:
Strong Handles:        155
Pinned Handles:        265
Async Pinned Handles:  8
Ref Count Handles:     163
Weak Long Handles:     0
Weak Short Handles:    0
Other Handles:         0

与自由对象的数量(45,000)相比,这是一个非常少的句柄(大约600)。对我来说,这排除了由固定引起的空闲块。

我还查看了自由块本身,看看它们是否具有一致的大小,但在检查时,尺寸变化很大,从短5MB到大约12个字节左右。

任何帮助将不胜感激!我不知所措,因为存在碎片,但没有任何迹象表明它是由我知道的两个地方引起的,它们是大对象堆(LOH)和固定手柄。

1 个答案:

答案 0 :(得分:1)

哪一代是免费对象?

  

由于尺寸

,我认为必须驻留在Gen 2中

尺寸与世代无关。要了解空闲块驻留在哪一代,您可以按照以下步骤操作:

!dumpheap -stat -type Free获取方法表:

0:003> !dumpheap -stat -type Free
total 7 objects
Statistics:
      MT    Count    TotalSize Class Name
00723538        7          100      Free
Total 7 objects

!eeheap -gc,获取世代的起始地址。

0:003> !eeheap -gc
Number of GC Heaps: 1
generation 0 starts at 0x026a1018
generation 1 starts at 0x026a100c
generation 2 starts at 0x026a1000
ephemeral segment allocation context: none
 segment    begin allocated     size
026a0000 026a1000  02731ff4 0x00090ff4(593908)
Large object heap starts at 0x036a1000
 segment    begin allocated     size
036a0000 036a1000  036a3250 0x00002250(8784)
Total Size   0x93244(602692)
------------------------------
GC Heap Size   0x93244(602692)

然后通过传递起始地址和结束地址(例如第2代)来转储仅特定代的自由对象:

0:003> !dumpheap -mt 00723538 0x026a1000 0x026a100c
 Address       MT     Size
026a1000 00723538       12 Free
026a100c 00723538       12 Free
total 2 objects
Statistics:
      MT    Count    TotalSize Class Name
00723538        2           24      Free
Total 2 objects

因此,在我的简单案例中,第2代中有2个自由对象。

固定手柄

600个固定对象不应导致45.000个空闲内存块。根据我的经验,600个固定手柄很多。但首先,检查空闲内存块驻留在哪一代。