从这个结果可初步查看哪些对象太多,占用内存过大。如结果中的:System.Collections.ArrayList 与 System.Object[]。当然,System.String最多,不过从经验看,每个程序这个对象都是最多的。从一个侧面,这告戒我们,在进行字符串连接运算时,最好不要用 String + String ……,而要习惯地用StringBuilder对象。有兴趣的同事可以自己用代码测测。如果要测试的话,还告诉你一个命令:!dumpheap -mt 790f9244-strings,会看得更清楚。
0:007> !dumpheap -mt 7910234c
Address MT Size
011412d0 7910234c 24
01141334 7910234c 24
01141630 7910234c 24
01141fb0 7910234c 24
……
0117f834 7910234c 24
total 389 objects
Statistics:
MT Count TotalSize Class Name
7910234c 389 9336 System.Collections.ArrayList
Total 389 objects
这就可以查看每个对象的“老家”了,当然这些对象中大部份是“良民”,要辩别出谁是“魔鬼”,还得用下面的手段。
0:007> !do 011412d0
Name: System.Collections.ArrayList
MethodTable: 7910234c
EEClass: 791022a0
Size: 24(0x18) bytes
(C:"WINDOWS"assembly"GAC_32"mscorlib"2.0.0.0__b77a5c561934e089"mscorlib.dll)
Fields:
MT Field Offset Type VT Attr Value Name
7912254c 40008c6 4 System.Object[] 0 instance 011412e8 _items
790fdb60 40008c7 c System.Int32 0 instance 2 _size
790fdb60 40008c8 10 System.Int32 0 instance 2 _version
790f8a7c 40008c9 8 System.Object 0 instance 00000000 _syncRoot
7912254c 40008ca 1b4 System.Object[] 0 shared static emptyArray
>> Domain:Value 0014e8d8:01131dec <<
可以看到这对象是一个ArrayList,其大小为2,具体的值保存在地址011412e8中,是一个System.Object[]类型的数组
这儿插一下,因为我今天运气好,选到一个数组对象作为例子。所以,我们就顺势再介绍两个步骤:以查看数据组中元素的值。