c# - 托管堆 .Net 4.5 中的未知对象

标签 c# .net memory memory-leaks windbg

我在服务器类 Windows 2012 R2 机器上遇到问题,该机器偶尔将其托管的 .net 堆增加到超过 10GB(通常应该是 1-2GB)。在第 2 代收集之后,我在此框上进行了内存转储,以尝试查找在堆上分配了哪些对象。

使用 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 命令来帮助找到这些吗?

最佳答案

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

您可以使用 !objsize 列出实例的大小。但是,由于多个实例可能共享对相同对象的引用,因此对 !objsize 的输出求和通常也会产生不正确的结果。

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

关于c# - 托管堆 .Net 4.5 中的未知对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25144907/

相关文章:

swift - 如何避免 alamofire get 请求内存泄漏?

c# - 使用 ToArray() 将列表转换为数组

c# - 如何为文本框提示横幅添加背景

.net - 等待任务 : Return task or await if no code after await

c# - 如何让 msbuild 在 vi​​sual studio 中部署任务?

objective-c - 方法内部的变量声明在实例化之前导致 gdb 垃圾输出

c# - 使用 C# 如何确定服务器上的 excel 文件是否已更新。此检查需要每 24 小时执行一次

C# DateTime 默认值 Issue 01/01/0001 00 :00:00

.net - 从用户输入的文本中提取(多个)电子邮件为 MailAddress 格式 (.NET)

c - 表示已知大小变量的表达式结果的最少位数?