在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
是整数
答案 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}");
}