我使用以下 sos 命令来枚举正在运行的 asp 应用程序(托管在 Windows xp 4 GB 计算机上)中特定类型的所有实例。
.foreach (obj { !dumpheap -type ::my type:: -short ::start of address space:: ::end of address space:: }) { !objsize ${obj} }.
这会枚举 gc gen2 中给定类型的所有对象。
对象大小平均约为 500 KB,大约有 2000 个对象。仅此一项就增加了大约 1 GB 内存,而任务管理器中我的 asp 进程内存仅显示大约 700 MB。还有一点是我没有考虑我正在使用的其他加载对象。
此外,上述所有对象都是不会被垃圾收集的根对象。不确定此命令是否错误,或者对于 sos 返回的大小不匹配以及任务管理器中显示的内容是否有任何其他解释?
提前致谢,
巴拉特·K.
!objsize
计算实例的大小,包括其所有引用的对象,因此,如果您有任何对象共享对其他对象的引用,则这些对象的大小将被多次计算。最常见的来源可能是字符串,因为文字字符串被保留,因此在使用相同文字文本的对象之间共享。但是,您可能还有引用相同对象的集合。在任何情况下,除非计数的对象根本不共享任何引用,否则总和将不正确。
考虑这个例子
class SomeType {
private readonly string Text;
public SomeType(string text) {
Text = text;
}
}
和这段代码
var st1 = new SomeType("this is a long string that will be stored only once due to interning");
var st2 = new SomeType("this is a long string that will be stored only once due to interning");
在WinDbg中
0:006> !dumpheap -type Some
Address MT Size
00ceb44c 00b738a8 12
00ceb458 00b738a8 12
0:006> !objsize 00ceb44c
sizeof(00ceb44c) = 164 ( 0xa4) bytes (TestApp.SomeType)
0:006> !objsize 00ceb458
sizeof(00ceb458) = 164 ( 0xa4) bytes (TestApp.SomeType)
0:006> !DumpObj 00ceb44c
Name: TestApp.SomeType
MethodTable: 00b738a8
EEClass: 00b714bc
Size: 12(0xc) bytes
File: c:\dev2010\FSharpLib\TestApp\bin\Release\TestApp.exe
Fields:
MT Field Offset Type VT Attr Value Name
79b9d2b8 4000001 4 System.String 0 instance 00ceb390 Text
0:006> !DumpObj 00ceb458
Name: TestApp.SomeType
MethodTable: 00b738a8
EEClass: 00b714bc
Size: 12(0xc) bytes
File: c:\dev2010\FSharpLib\TestApp\bin\Release\TestApp.exe
Fields:
MT Field Offset Type VT Attr Value Name
79b9d2b8 4000001 4 System.String 0 instance 00ceb390 Text
从输出中可以看到!dumpobj
,它们都共享相同的参考,因此如果您将报告的大小相加!objsize
上面,字符串被计算了两次。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)