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

时间:2015-12-10 11:03:44

标签: 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) };

我正在寻找一个返回x.GetTotalMemorySize()

的函数:76 = 16 + 3 * (4 + (8 + 8)))

即:

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

3是数组中元素的数量

4是元组指针使用的字节

8 + 8是整数

使用的字节数

2 个答案:

答案 0 :(得分:2)

您可以使用免费的dotMemory Unit框架来测量代码中的内存

    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);

输出:ObjectsCount:4; SizeInBytes:128

更新:当然我应该选择数组类型&#34; Tuple&lt; int,int&gt; []&#34;而不是&#34; Tuple&lt; int,int&gt;&#34;。更新了代码和输出

答案 1 :(得分:1)

如果您有无菌环境,可以使用GC.GetTotalMemory

void Main()
{
    GC.Collect(2);
    var before = GC.GetTotalMemory(false);
    Console.WriteLine($"Before: {before}");
    var x = new Tuple<int,int>[3] { Tuple.Create(0,0), 
                                    Tuple.Create(0,0), 
                                    Tuple.Create(0,0) };

    var after = GC.GetTotalMemory(false);
    Console.WriteLine($"After: {after}");
    Console.WriteLine($"Diff was: {after - before}");
}