.net 如何确定对象被固定的原因

.net 如何确定对象被固定的原因,.net,windbg,.net,Windbg,我试图找出应用程序中某些对象被固定的原因。到目前为止,我看到的对象是对象数组!gcroot显示数组被固定,但我不知道如何找出它被固定的原因 输出: 0:000> !dumpobj 0239cea0 Name: System.Object[] MethodTable: 793041d0 EEClass: 790eda54 Size: 528(0x210) bytes Array: Rank 1, Number of elements 128, Type CLASS Element Type:

我试图找出应用程序中某些对象被固定的原因。到目前为止,我看到的对象是对象数组!gcroot显示数组被固定,但我不知道如何找出它被固定的原因

输出:

0:000> !dumpobj 0239cea0
Name: System.Object[]
MethodTable: 793041d0
EEClass: 790eda54
Size: 528(0x210) bytes
Array: Rank 1, Number of elements 128, Type CLASS
Element Type: System.Object
Fields:
None

0:000> !gcroot 0239cea0
Note: Roots found on stacks may be false positives. Run "!help gcroot" for
more info.
Scan Thread 0 OSTHread f3c
Scan Thread 2 OSTHread e54
Scan Thread 4 OSTHread 748
Scan Thread 5 OSTHread fe0
Scan Thread 7 OSTHread 7a0
Scan Thread 9 OSTHread cf4
Scan Thread 10 OSTHread a6c
Scan Thread 11 OSTHread bc4
Scan Thread 12 OSTHread 598
Scan Thread 13 OSTHread a8
Scan Thread 14 OSTHread 50c
Scan Thread 15 OSTHread ba4
Scan Thread 16 OSTHread b40
Scan Thread 17 OSTHread 534
Scan Thread 18 OSTHread 5fc
Scan Thread 19 OSTHread dfc
Scan Thread 20 OSTHread cc4
Scan Thread 21 OSTHread f84
Scan Thread 22 OSTHread 9f4
Scan Thread 23 OSTHread ff0
Scan Thread 24 OSTHread fb0
Scan Thread 25 OSTHread c14
Scan Thread 29 OSTHread 5c4
DOMAIN(0015EB90):HANDLE(Pinned):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(WeakSh):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(WeakSh):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(WeakSh):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(Unknwn):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(WeakSh):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(Unknwn):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(WeakSh):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(WeakSh):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(Unknwn):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(Unknwn):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(WeakSh):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(Unknwn):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(Unknwn):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(Unknwn):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(Unknwn):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(Unknwn):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(Unknwn):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(Unknwn):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(Unknwn):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(Unknwn):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(Unknwn):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(Unknwn):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(Unknwn):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(Unknwn):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(Unknwn):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(Unknwn):971e74:Root:0239cea0(System.Object[])
DOMAIN(0015EB90):HANDLE(Unknwn):971e74:Root:0239cea0(System.Object[])
编辑:添加!eeheap-gc输出

!eeheap -gc
Number of GC Heaps: 1
generation 0 starts at 0x49a6f940
generation 1 starts at 0x49a0c8a8
generation 2 starts at 0x01301000
ephemeral segment allocation context: none
 segment    begin allocated     size
01300000 01301000  022f05a0 0x00fef5a0(16709024)
0d0d0000 0d0d1000  0e0bb0cc 0x00fea0cc(16687308)
0e9e0000 0e9e1000  0f9de3e8 0x00ffd3e8(16765928)
11020000 11021000  12014808 0x00ff3808(16726024)
15020000 15021000  15ff3958 0x00fd2958(16591192)
139f0000 139f1000  1499f584 0x00fae584(16442756)
16020000 16021000  16fd7c30 0x00fb6c30(16477232)
19020000 19021000  1a013df4 0x00ff2df4(16723444)
17020000 17021000  17fcfe8c 0x00faee8c(16445068)
18020000 18021000  18fedb84 0x00fccb84(16567172)
1a020000 1a021000  1afc8814 0x00fa7814(16414740)
26010000 26011000  26f97d2c 0x00f86d2c(16280876)
2d010000 2d011000  2df97210 0x00f86210(16278032)
20010000 20011000  210028e0 0x00ff18e0(16718048)
21010000 21011000  220085d8 0x00ff75d8(16741848)
23810000 23811000  247acf60 0x00f9bf60(16367456)
28010000 28011000  28f84f80 0x00f73f80(16203648)
1c010000 1c011000  1cfba544 0x00fa9544(16422212)
1d010000 1d011000  1dfdcf64 0x00fcbf64(16564068)
32010000 32011000  32f9189c 0x00f8089c(16255132)
1e010000 1e011000  1eff9824 0x00fe8824(16680996)
2c010000 2c011000  2cfd4904 0x00fc3904(16529668)
300a0000 300a1000  3104a488 0x00fa9488(16422024)
24810000 24811000  2571bd20 0x00f0ad20(15772960)
36d10000 36d11000  37c982d4 0x00f872d4(16282324)
29010000 29011000  29fc96a0 0x00fb86a0(16484000)
27010000 27011000  27ee38bc 0x00ed28bc(15542460)
2a010000 2a011000  2afab094 0x00f9a094(16359572)
441c0000 441c1000  45149df0 0x00f88df0(16289264)
38d10000 38d11000  39ce4254 0x00fd3254(16593492)
3bd10000 3bd11000  3cc7a750 0x00f69750(16160592)
3ad10000 3ad11000  3bc8b878 0x00f7a878(16230520)
411c0000 411c1000  421655a0 0x00fa45a0(16401824)
2b010000 2b011000  2bfafae4 0x00f9eae4(16378596)
461c0000 461c1000  471a1bb0 0x00fe0bb0(16649136)
3e1c0000 3e1c1000  3f11151c 0x00f5051c(16057628)
34010000 34011000  35003ae4 0x00ff2ae4(16722660)
451c0000 451c1000  4609e680 0x00edd680(15586944)
4c1c0000 4c1c1000  4d105324 0x00f44324(16007972)
2f0a0000 2f0a1000  3007989c 0x00fd889c(16615580)
50e10000 50e11000  51cf17d8 0x00ee07d8(15599576)
33010000 33011000  34005d88 0x00ff4d88(16731528)
37d10000 37d11000  38cc6d7c 0x00fb5d7c(16473468)
481c0000 481c1000  4898a468 0x007c9468(8164456)
39d10000 39d11000  3acbe2d8 0x00fad2d8(16437976)
3f1c0000 3f1c1000  3fd1f378 0x00b5e378(11920248)
51e10000 51e11000  52e01018 0x00ff0018(16711704)
431c0000 431c1000  441805d8 0x00fbf5d8(16512472)
401c0000 401c1000  4116b2b0 0x00faa2b0(16425648)
421c0000 421c1000  430da254 0x00f19254(15831636)
491c0000 491c1000  49b98e0c 0x009d7e0c(10321420)
Large object heap starts at 0x02301000
 segment    begin allocated     size
02300000 02301000  02f1bf20 0x00c1af20(12693280)
Total Size  0x31786160(829972832)
------------------------------
GC Heap Size  0x31786160(829972832)

根据我的经验,查看
Object[]
很少有用,因为它是许多类型的基础类型,这意味着您将在堆中找到很多这样的类型,从而更难识别正确的类型。此外,诸如的内部结构也存储为
对象[]

如果您试图找出应用程序使用大量内存的原因,请尝试识别可能封装或可能不封装
Object[]
的其他类型,并找出这些类型的根源

如果你能提供更多关于你想要实现的目标的信息,我也许能提供更具体的建议

编辑:碎片不一定像听起来那么糟糕,100 MB的空闲空间对我来说并不是一个惊人的高数字。您是否已确定空闲块是否位于大型对象堆上的分代堆中


的输出是什么!eeheap-gc

GCRoot通常不会告诉您固定某些内容的原因。在CLR中找到的许多对象数组都用于内部事务。相反,阅读你对另一个答案的评论,我能建议你首先从不同的东西开始追踪你的内存泄漏吗

从“!dumpheap-stat”开始,看看那里最大的内存用户。但是,请忽略基本的CLR类型,如object[],string等。查找存在哪些对象(定义为“不是mscorlib或system.dll中的某个对象”),并找出这些对象的根。通常,从该方向跟踪泄漏会更容易,即使您的应用程序中泄漏了一个基本类型


这通常是我在CLR中跟踪托管泄漏的方式,它对大多数泄漏都很有效。

中的
!findroots
命令(或
!refs
中)等待下一个GC(您可以指定哪一代),然后告诉您对象的根是什么。

这可能会有所帮助


我正在寻找可能的内存碎片,以解决我的OOM问题。使用作为起点。我看到了非常不同的!gcroot输出在内存转储中我有48093个可用对象,消耗112MB转储文件是1.2GB。运行一个!gcroot大约需要30分钟,因此我只能对随机对象进行采样。我不认为典型的对象的e非常重要,只是它被钉住了。这只是我们正在寻找OOM问题的一个方面。在过去的10个小时里已经有了300MB的事件泄漏。在大计划中,100MB并没有那么大,但它可能会把东西弄得乱七八糟。我相信我正在寻找的对象是gen2,它是一个桌面应用程序大多数事情都在gen2中结束。LOH为60MB free您的堆使用率为800MB,eeheap显示大多数在gen2堆上,而LOH上只有一部分。如果您想识别空闲块,可以使用!dumpheap类型free!我的理解是正确的!dumpheap类型free返回没有对象且不可用的空间?pinne我问题中的d对象是一个空闲项之后的下一个对象。我只是从480093列表中随机选择了一对。我认为这是一个死胡同。是的,空闲点是堆上的空闲空间。如果它们位于固定对象旁边,则在压缩过程中它们将不可用。但是,这些对象不应该永远被钉住,所以压缩最终应该能够摆脱空闲的块。是的,这就是为什么我问如何确定对象被钉住的原因。gcroot只是告诉我对象被钉住了。据我所知,没有办法确定对象被钉住的原因。再次回到这个特定的示例,对象阵列的钉住y是我们在CLR中存储静态变量的方式。因此,您可能正在查看静态变量的存放位置,但我不能确定。一些固定句柄可以告诉您它们按类型固定的原因(例如,RefCnt句柄仅在com互操作中使用)。但是,通常情况下,您无法确定在无法访问CLR源和符号的情况下锁定对象的原因。堆栈溢出时不建议使用仅链接的答案。如果链接断开,则信息几乎没有用处。最好将相关部分作为答案的摘录。谢谢。