.NET应用程序调试—原理、工具、方法(15)
624ac448 8 484 System.Int32[]
624ad3a0 2 616 System.Globalization.CultureData
624abe78 26 728 System.RuntimeType
624ab680 7 2910 System.Char[]
6245ab98 25 18064 System.Object[]
624aacc0 3283 85972 System.String
00363a78 7 2031754 Free
624696f8 2 2097184 System.Byte[][]
624acf54 301232 304844554 System.Byte[]
最后一个显然内存占用比较高,占了304844554 bite,如果你想在此情况下知道对象的内存地址你就直接使用!dumpheap ,不带任何参数。由于此命令会导致很多输出,我这里就写出输出内容了。通过!dumpheap 会得到内存很高的对象地址,02d55368,这个地址就是System.Byte[]对象,为了找到对象在哪里分配的,我们需要使用!gcroot 02d55368,命令,查看对象的根在哪里。
0:000> !gcroot 02d55368
Thread 143310:
0028f364
004f0100 OrderManager.Program.Main(System.String[])
[e:\NETDebug\DebugDemoProject\OrderManager\Program.cs @ 22]
ebp+18:
0028f380
-> 01b746c0
System.Collections.Generic.List`1[[System.Byte[], mscorlib]]
-> 02d55368 System.Byte[][]
知道了根就好办多了,直接看源代码就能发现问题。如果你还不死心的话可以使用!dumpobj 查看List对象。
0:000> !dumpobj 01b746c0
Name:
System.Collections.Generic.List`1[[System.Byte[], mscorlib]]
MethodTable:
00163170
EEClass: 6211c8b0
Size: 24(0x18) bytes
File:
C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
Fields:
MT Field Offset Type VT Attr Value Name
6245ab98
4000c75 4 System.Object[] 0 instance 02d55368 _items
624ac480
4000c76 c System.Int32 1 instance 301229 _size
624ac480
4000c77 10 System.Int32 1 instance 301229 _version
624ab060
4000c78 8 System.Object 0 instance 00000000
_syncRoot
相关新闻>>
- 发表评论
-
- 最新评论 更多>>