一个对象及其依赖项使用的内存
本文关键字:内存 依赖 一个对象 | 更新日期: 2023-09-27 18:26:25
在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
是int 使用的字节
您可以使用免费的dotMemory单元框架来测量代码中的内存
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);
输出:对象计数:4;SizeInBytes:128
更新:当然我应该选择数组类型"Tuple<int,int>[]"而不是"Tuple<int,int"。更新了代码和输出
如果您有无菌环境,您可以使用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}");
}