Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net sos.dll返回的对象大小与内存进程大小不匹配_.net_Clr_Windbg_Sos - Fatal编程技术网

.net sos.dll返回的对象大小与内存进程大小不匹配

.net sos.dll返回的对象大小与内存进程大小不匹配,.net,clr,windbg,sos,.net,Clr,Windbg,Sos,我已使用以下sos命令枚举正在运行的asp应用程序(托管在windows xp 4 GB计算机上)中特定类型的所有实例 这将枚举gc gen2中给定类型的所有对象 对象的平均大小似乎在500 KB左右,大约有2000个对象。仅此一项就可以增加大约1GB的内存,而任务管理器中的asp进程内存仅显示大约700MB。还有一点是,我没有考虑我正在使用的其他加载对象 此外,上述所有对象都是不会被垃圾收集的根对象。不确定此命令是否错误,或者是否有任何其他解释说明sos返回的大小不匹配以及任务管理器中显示的内

我已使用以下sos命令枚举正在运行的asp应用程序(托管在windows xp 4 GB计算机上)中特定类型的所有实例

这将枚举gc gen2中给定类型的所有对象

对象的平均大小似乎在500 KB左右,大约有2000个对象。仅此一项就可以增加大约1GB的内存,而任务管理器中的asp进程内存仅显示大约700MB。还有一点是,我没有考虑我正在使用的其他加载对象

此外,上述所有对象都是不会被垃圾收集的根对象。不确定此命令是否错误,或者是否有任何其他解释说明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
中,字符串被计数两次

您在任务管理器中查看哪个计数器?顺便说一句!dh显示指定图像的标题。我猜你的意思是
!垃圾堆
。是的。它是!垃圾堆。感谢Rasmussen,我的每个对象都包含一个不同的xml文档,该文档是根据表单(字符串)的定义构造的,表单(字符串)本质上是唯一的。再次感谢您的深刻见解。我将再次验证字符串是否确实被扣留,并在发生这种情况时将此问题标记为关闭。
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