C# 一个对象使用的内存及其依赖项
在C#中,是否有可能知道一个对象及其依赖项分配了多少字节?我知道我可以使用dotMemory来实现这一点,但是有没有办法从GC或者其他什么东西来从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
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
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);