我正在调查PerfMon& amp;的内存泄漏问题。 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这两个快照,最大的区别是'Free'的大小。它的大小增加了近16MB。 任何人都可以告诉我“免费”的含义是什么,是免费空间吗?是否由于市场导致增加?
根据this article,“大对象堆大小”性能计数器似乎包括可用空间。 所以在我的情况下,大对象堆上没有太多的内存泄漏,只有2MB(= 28 - 10 - 16),对吗?
答案 0 :(得分:5)
FREE表示堆上未使用的内存块。预计LOH会有免费区块,因为LOH永远不会被压缩。相反,为LOH保留了一个免费空间列表。普通GC堆上的FREE块,除了少数例外,表示由于对象的固定而导致的碎片。当GC遇到固定对象时,段的压缩将停止,未使用对象消耗的内存将标记为FREE。您在LOH上看到的是正常的。请记住,LOH永远不会被压缩,分配给LOH的内存段永远不会被释放,所以LOH永远不会缩小。
答案 1 :(得分:0)
大对象堆的含义是well explained here。
大对象是大小超过85kb的对象,存储在该区域中,并且仅在回收第2代时才收集。