Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.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
C# 一个对象使用的内存及其依赖项_C#_Memory Management - Fatal编程技术网

C# 一个对象使用的内存及其依赖项

C# 一个对象使用的内存及其依赖项,c#,memory-management,C#,Memory Management,在C#中,是否有可能知道一个对象及其依赖项分配了多少字节?我知道我可以使用dotMemory来实现这一点,但是有没有办法从GC或者其他什么东西来从C#获得这一点呢 例如,如果我有: var x = new Tuple<int,int>[3] { Tuple.Create(0,0), Tuple.Create(0,0), Tuple.Create(0,0) }; varx=newtuple[3]{Tuple.Create(0,0),Tuple.Create(0,0),Tuple.Cr

在C#中,是否有可能知道一个对象及其依赖项分配了多少字节?我知道我可以使用dotMemory来实现这一点,但是有没有办法从GC或者其他什么东西来从C#获得这一点呢

例如,如果我有:

var x = new Tuple<int,int>[3] { Tuple.Create(0,0), Tuple.Create(0,0), Tuple.Create(0,0) };
varx=newtuple[3]{Tuple.Create(0,0),Tuple.Create(0,0),Tuple.Create(0,0)};
我正在寻找一个类似于:
x.GetTotalMemorySize()
的函数,它返回
76=16+3*(4+(8+8))

即:

16
是数组开销中使用的字节数

3
是数组中的元素数

4
是元组指针使用的字节


8+8
是ints使用的字节数

如果您有无菌环境,您可以使用:

void Main()
{
GC.Collect(2);
var before=GC.GetTotalMemory(false);
WriteLine($“Before:{Before}”);
var x=新元组[3]{Tuple.Create(0,0),
Tuple.Create(0,0),
创建(0,0)};
var after=GC.GetTotalMemory(false);
WriteLine($“After:{After}”);
WriteLine($“Diff was:{after-before}”);
}
您可以使用自由框架从代码中度量内存

    var x = new Tuple<int,int>[3] { Tuple.Create(0,0), Tuple.Create(0,0), Tuple.Create(0,0) };
    dotMemory.Check(memory =>
    {
      var objectSet = memory.GetObjects(where => where.Type.Is<Tuple<int, int>[]>())
                            .GetExclusivelyRetainedObjects();

      Console.WriteLine(objectSet);
    });
    GC.KeepAlive(x);
varx=newtuple[3]{Tuple.Create(0,0),Tuple.Create(0,0),Tuple.Create(0,0)};
dotMemory.Check(内存=>
{
var objectSet=memory.GetObjects(where=>where.Type.Is())
.GetExclusivelyRetainedObjects();
Console.WriteLine(objectSet);
});
GC.KeepAlive(x);
输出:ObjectsCount:4;大小字节:128


更新:当然我应该选择数组类型“Tuple[]”,而不是“Tuple”。更新了代码和输出

当然,这很有帮助,但并不完全相同,您必须重新生成要测量的整个结构,因此这非常痛苦。另外,如果你不小心,优化器可能会优化分配…@d--b我不太确定是什么“意思不太一样。是的,你必须复制整个结构,但那是你要求的。在运行时执行此操作几乎不可能获得准确的结果,因为您有一系列影响GC的依赖项。我会坚持使用探查器来实现这一点。这不完全一样,因为根据C#文档:
GC.GetTotalMemory是当前在托管内存中分配的字节数的最佳近似值
@d--b这是通过代码可以获得的最佳值。如果您确实想查看调试器,可以使用
WinDBG
来浏览运行时。
    var x = new Tuple<int,int>[3] { Tuple.Create(0,0), Tuple.Create(0,0), Tuple.Create(0,0) };
    dotMemory.Check(memory =>
    {
      var objectSet = memory.GetObjects(where => where.Type.Is<Tuple<int, int>[]>())
                            .GetExclusivelyRetainedObjects();

      Console.WriteLine(objectSet);
    });
    GC.KeepAlive(x);