7

我正在调查 PerfMon 和 WinDbg 的内存泄漏问题。我注意到“大内存堆”计数器从 10MB 增加到 37MB。强制 GC 后,它只能减少到 28MB。 在此处输入图像描述

(无论我重复多少次操作(创建/销毁),在 GC 之后,大对象堆稳定在 28MB)。

我想知道哪些对象会导致泄漏问题,所以我使用 '!Dumpheap -min 85000' 命令运行 WinDbg。捕获了两张快照,第一张是在内存泄漏之前完成的;第二个是内存泄漏之后:

前:

       MT    Count    TotalSize Class Name
 6f39fb08        1        89024 System.String
 6f3a4aa0        1       107336 System.Byte[]
 6f356d84        2       262176 System.Object[]
 00360e4c        1       350392 System.Collections.Generic.Dictionary`2+Entry[Int64,Int32][]
 6f3a2a94        3       592584 System.Int32[]
 00360c24        1       727072 System.Collections.Generic.Dictionary`2+Entry[String,Int64][]
 0bc78b34        4      2754488 System.Collections.Generic.Dictionary`2+Entry[Int64, AccountNode][]
 00730260       10      5375572      Free

后:

       MT    Count    TotalSize Class Name
 6f39fb08        1        89024 System.String
 6f3a4aa0        1       107336 System.Byte[]
 6f3a55d8        2       202080 System.Collections.Hashtable+bucket[]
 6f356d84        2       262176 System.Object[]
 00360e4c        1       350392 System.Collections.Generic.Dictionary`2+Entry[Int64,Int32][]
 00360c24        1       727072 System.Collections.Generic.Dictionary`2+Entry[String,Int64][]
 6f3a2a94        4       738008 System.Int32[]
 6cf02838        1       872488 System.Collections.Generic.Dictionary`2+Entry[[MS.Internal.ComponentModel.PropertyKey, WindowsBase],[MS.Internal.ComponentModel.DependencyPropertyKind, WindowsBase]][]
 0bc78b34        4      2754488 System.Collections.Generic.Dictionary`2+Entry[Int64, AccountNode][]
 00730260       14     21881328      Free
 Total 31 objects

Camparing 这两个快照,最大的区别是“免费”的大小。它的大小增加了近 16MB。谁能告诉我“免费”是什么意思,是免费空间吗?增加是由碎片引起的吗?

根据这篇文章,“大对象堆大小”性能计数器似乎包括可用空间。所以在我的情况下,大对象堆上没有太多的内存泄漏,只有 2MB (= 28 - 10 -16),对吧?

4

2 回答 2

5

FREE 表示堆上的一块未使用的内存。LOH 上的空闲块是预期的,因为 LOH 永远不会被压缩。相反,为 LOH 保留了一个可用空间列表。正常 GC 堆上的 FREE 块,除了少数例外,表示由于对象固定导致的碎片。当 GC 遇到 pinned 对象时,段的压缩将停止,未使用对象消耗的内存被标记为 FREE。您在 LOH 上看到的内容是正常的。请记住,LOH 永远不会被压缩,并且为 LOH 分配的内存段永远不会被释放,因此 LOH 永远不会收缩。

于 2013-01-16T15:09:04.423 回答
0

大对象堆的含义在这里解释得很好

大对象是大小大于 85kb 的对象,存储在该区域中,并且仅在第 2 代将被回收时才被收集。

于 2013-01-16T07:41:10.280 回答