!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
報告的大小求和,字符串就是c安裝了兩次。
你在任務管理器中查看什麼計數器? – 2010-02-23 07:53:50
Btw'!dh'顯示指定圖像的標題。我假設你的意思是'!dumpheap'。 – 2010-02-23 08:08:07
是的。它是!dumpheap。我在任務管理器中查看了內存使用情況和內存使用情況峯值。 – 2010-02-23 08:18:00