托管堆.net 4.5中的未知对象

本文关键字:未知 对象 net | 更新日期: 2023-09-27 18:16:25

我在一台服务器级windows 2012 R2机器上遇到了麻烦,它偶尔会将其托管的。net堆增加到10GB以上(通常应该是1-2 GB)。在Gen2收集之后,我在这个机器上进行了内存转储,以试图找到在堆上分配了哪些对象。

使用WinDbg/SOS

!dumpheap -stat

生成一个对象列表,其中最大的对象占用约150mb内存,并迅速向下跟踪。将此输出拉入excel并将TotalSize相加,我只得到1.5 GB的对象(与我期望的内联)。

              MT    Count    TotalSize Class Name
00007ffb1ab87a70        1           24 System.Collections.Generic.GenericEqualityComparer`1[[System.UInt64, mscorlib]]
...
00007ffabc178e40   218274     36670032 Ten.RunBar
00007ffabbd172f8  1048576     41943040 Ten.DisruptorTaskTuple
00007ffb1a0502c0   442990     71357200 System.Object[]
00007ffabc1bbce0   676327     97391088 Ten.BalTuple
00007ffabbd5eea8  2342912    149946368 Ten.Run.TaskAction
0000001bf119dc70  1072558    787427166      Free
MANUALLY CALCULATED TOTAL:  1589298584

我的第一个想法是有一些非托管内存泄漏,所以我用

检查堆
!EEHeap -gc

显示GC堆大小本身实际上是10GB

Number of GC Heaps: 1
generation 0 starts at 0x0000001e10623cb0
generation 1 starts at 0x0000001e10485bb0
generation 2 starts at 0x0000001b80001000
ephemeral segment allocation context: none
 segment     begin allocated  size
0000001b80000000  0000001b80001000  0000001b90000000  0xffff000(268431360)
0000001b98000000  0000001b98001000  0000001ba8000000  0xffff000(268431360)
...
0000001e04ee0000  0000001e04ee1000  0000001e109c2cc0  0xbae1cc0(195960000)
Large object heap starts at 0x0000001b90001000
 segment     begin allocated  size
0000001b90000000  0000001b90001000  0000001b9356cbc8  0x356bbc8(56015816)
Total Size:              Size: 0x25f028618 (10183935512) bytes.
------------------------------
GC Heap Size:            Size: 0x25f028618 (10183935512) bytes.

我已经确认内存都在第二代堆(性能计数器)中,但我不确定从这里寻找缺失的8.5 GB托管对象。

有没有其他的想法/WinDbg/SOS命令来帮助找到这些?

托管堆.net 4.5中的未知对象

!dumpheap报告的大小是类型本身的大小,而不是实例的实际大小。

您可以使用!objsize列出实例的大小。然而,由于多个实例可能共享引用,所以对!objsize的输出求和通常也会产生错误的结果。

计算托管堆大小的最佳方法是查看!dumpheap!eeheap报告的总数。