使用WinDbg转储时,大对象堆的'Free'块的含义是什么?

And*_*s06 7 c# memory-leaks windbg

我正在调查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
Run Code Online (Sandbox Code Playgroud)

后:

       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
Run Code Online (Sandbox Code Playgroud)

对这两个快照进行营销,最大的区别是"免费"的大小.它的大小增加了近16MB.任何人都可以告诉我"免费"的含义是什么,是免费空间吗?是否由于fragements引起的增加?

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

Ste*_*son 5

FREE表示堆上未使用的内存块.预计LOH会有免费区块,因为LOH永远不会被压缩.相反,为LOH保留了一个免费空间列表.普通GC堆上的FREE块,除了少数例外,表示由于对象的固定而导致的碎片.当GC遇到固定对象时,段的压缩将停止,未使用对象消耗的内存将标记为FREE.您在LOH上看到的是正常的.请记住,LOH永远不会被压缩,分配给LOH的内存段永远不会被释放,因此LOH永远不会缩小.


Ant*_*cca 0

这里很好地解释了大对象堆的含义。

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