C# 这些24字节的小块在LOH上做什么?

C# 这些24字节的小块在LOH上做什么?,c#,.net,clr,C#,.net,Clr,我们将此应用程序作为Windows服务运行。我正在使用任务管理器和perfmon检查它的内存使用情况,我注意到它不时地分配大块内存,这些内存在很长一段时间内不会被释放。无论如何,我已经开始检查进程转储,在LOH分析期间,我注意到由于某种原因,这些小对象被放置在LOH上。每个可用内存块都有24个字节——这是怎么可能的,因为只有大于85Kb的对象才能在LOH上结束?这个小数据块在未“释放”时会导致内存泄漏吗 0:000> !EEHeap -gc Number of GC Heaps: 1

我们将此应用程序作为Windows服务运行。我正在使用任务管理器和perfmon检查它的内存使用情况,我注意到它不时地分配大块内存,这些内存在很长一段时间内不会被释放。无论如何,我已经开始检查进程转储,在LOH分析期间,我注意到由于某种原因,这些小对象被放置在LOH上。每个可用内存块都有24个字节——这是怎么可能的,因为只有大于85Kb的对象才能在LOH上结束?这个小数据块在未“释放”时会导致内存泄漏吗

0:000> !EEHeap -gc
Number of GC Heaps: 1
      generation 0 starts at 0x0000000001520400
      generation 1 starts at 0x000000000148b8e0
      generation 2 starts at 0x00000000010b1000
      ephemeral segment allocation context: none
               segment             begin         allocated  size
      00000000010b0000  00000000010b1000  00000000016eb568  0x63a568(6530408)
      Large object heap starts at 0x00000000110b1000
               segment             begin         allocated  size
      00000000110b0000  00000000110b1000  0000000016e74bf0  0x5dc3bf0(98319344)
      Total Size:              Size: 0x63fe158 (104849752) bytes.
      ------------------------------
      GC Heap Size:    Size: 0x63fe158 (104849752) bytes.
      0:000> !dumpheap 00000000110b1000  0000000016e74bf0  
               Address               MT     Size
      00000000110b1000 000000000057c1b0       24 Free
      00000000110b1018 000007feedc1ae68     8192     
      00000000110b3018 000000000057c1b0       24 Free
      00000000110b3030 000007feedc1ae68     1056     
      00000000110b3450 000000000057c1b0     7136 Free
      00000000110b5030 000007feedc1ae68     8192     
      00000000110b7030 000000000057c1b0       24 Free
      00000000110b7048 000007feedc1ae68    16352     
      00000000110bb028 000000000057c1b0       24 Free
      00000000110bb040 000007feedc1ae68    32672     
      00000000110c2fe0 000000000057c1b0       24 Free
      00000000110c2ff8 000007feedc1ae68     2080     
      00000000110c3818 000000000057c1b0     6112 Free
      00000000110c4ff8 000007feedc1ae68     4128     
      00000000110c6018 000000000057c1b0   393312 Free
      0000000011126078 000007feedc20bb0   524312     
      00000000111a6090 000000000057c1b0       24 Free
      00000000111a60a8 000007feedc16960  1438960     
      0000000011305598 000000000057c1b0       24 Free
      00000000113055b0 000007feedc20bb0  1048600     
      00000000114055c8 000007feedc16960  1439352     
      0000000011564c40 000000000057c1b0       24 Free
      0000000011564c58 000007feedc1b318  1449800     
      00000000116c6ba0 000000000057c1b0       24 Free
      00000000116c6bb8 000000000057c1b0    70752 Free
      00000000116d8018 000007feedc1ae68    65312     
      00000000116e7f38 000007feedc20bb0   722704     
      0000000011798648 000000000057c1b0       24 Free
      0000000011798660 000007feedc1b318  1449792     
      00000000118fa5a0 000000000057c1b0       24 Free
      00000000118fa5b8 000007feedc16960  1437664     
      0000000011a59598 000000000057c1b0       24 Free
      0000000011a595b0 000007feedc1b318  1450248     
      0000000011bbb6b8 000000000057c1b0       24 Free
      0000000011bbb6d0 000007feedc20bb0   364840     
      0000000011c147f8 000000000057c1b0       24 Free
      0000000011c14810 000007feedc20bb0   364840     
      0000000011c6d938 000000000057c1b0       24 Free
      0000000011c6d950 000007feedc20bb0   131096     
      0000000011c8d968 000000000057c1b0       24 Free
      0000000011c8d980 000007feedc20bb0   262168     
      0000000011ccd998 000000000057c1b0       24 Free
      0000000011ccd9b0 000007feedc20bb0   524312     
      0000000011d4d9c8 000000000057c1b0       24 Free
      0000000011d4d9e0 000007feedc20bb0   364840     
      0000000011da6b08 000000000057c1b0       24 Free
      0000000011da6b20 000007feedc16960   544480     
      0000000011e2ba00 000000000057c1b0       24 Free
      0000000011e2ba18 000007feedc1b318   544480     
      0000000011eb08f8 000000000057c1b0       24 Free
      0000000011eb0910 000007feedc20bb0   272256     
      0000000011ef3090 000000000057c1b0       24 Free
      0000000011ef30a8 000007feedc20bb0   131096     
      0000000011f130c0 000000000057c1b0       24 Free
      0000000011f130d8 000007feedc20bb0   262168     
      0000000011f530f0 000000000057c1b0       24 Free
      0000000011f53108 000000000057c1b0   269104 Free
      0000000011f94c38 000007feedc1ae68    16352     
      0000000011f98c18 000007feedc20bb0   524312     
      0000000012018c30 000000000057c1b0       24 Free
      0000000012018c48 000000000057c1b0   196152 Free
      0000000012048a80 000007feedc1ae68     8224     
      000000001204aaa0 000007feedc16960  1437664     
      00000000121a9a80 000007feedc20bb0   272256     
      00000000121ec200 000000000057c1b0       24 Free
      00000000121ec218 000007feedc20bb0   143144     
      000000001220f140 000000000057c1b0       24 Free
      000000001220f158 000007feedc20bb0   143144     
      0000000012232080 000000000057c1b0       24 Free
有人能解释一下吗

谢谢,
Marcin

注意,24字节是x64上的最小对象大小。我怀疑它们是为插件信息留下的空白,但如果没有我的@KonradKokosa的Pro.NET内存管理副本,我就记不清了。如果您有副本,请查看第9章。似乎您有LOH碎片,它可能会导致32位系统出现问题(如OOM问题)。由于需要连续的地址空间来分配新对象,因此第2代集合可能会非常频繁&由于碎片化,尽管可能有足够的可用空间,但它不会连续。我建议深入挖掘,找出正在分配的那些大对象,并尝试消除碎片。最简单的方法可能是内存池,但这取决于您的具体情况。@Michael,您有什么证据表明存在LOH碎片?那个垃圾堆在我看来相当不错。嗨,谢谢你的回复。好吧,尽管我怀疑LOH碎片化,但LOH上似乎没有任何固定对象(而不是必需的对象,它们应该在应用程序生命周期中存在)。我使用gcroot检查了一些对象,但没有它们的引用。我认为完整GC还没有达到,也许还没有达到阈值?@lasjan我仍然会查看LOH中的一些对象,以找到它们是什么?使用
!do可能由不同的原因引起。查看内存占用的另一个很好的工具是VMMap,我也会使用它来查看那里发生了什么。请注意,24字节是x64上的最小对象大小。我怀疑它们是为插件信息留下的空白,但如果没有我的@KonradKokosa的Pro.NET内存管理副本,我就记不清了。如果您有副本,请查看第9章。似乎您有LOH碎片,它可能会导致32位系统出现问题(如OOM问题)。由于需要连续的地址空间来分配新对象,因此第2代集合可能会非常频繁&由于碎片化,尽管可能有足够的可用空间,但它不会连续。我建议深入挖掘,找出正在分配的那些大对象,并尝试消除碎片。最简单的方法可能是内存池,但这取决于您的具体情况。@Michael,您有什么证据表明存在LOH碎片?那个垃圾堆在我看来相当不错。嗨,谢谢你的回复。好吧,尽管我怀疑LOH碎片化,但LOH上似乎没有任何固定对象(而不是必需的对象,它们应该在应用程序生命周期中存在)。我使用gcroot检查了一些对象,但没有它们的引用。我认为完整GC还没有达到,也许还没有达到阈值?@lasjan我仍然会查看LOH中的一些对象,以找到它们是什么?使用
!do可能由不同的原因引起。查看内存足迹的另一个伟大工具是VMMap,我也会使用它来查看那里发生了什么。