我需要知道我的对象在内存中消耗多少字节(在c#中)。例如我的哈希表,或SortedList,或List<String>。


当前回答

非托管对象:

Marshal.SizeOf(object yourObj);

值类型:

瓦尔sizeof(对象)

管理对象:

看起来没有直接的方法来获取托管对象,参考: https://learn.microsoft.com/en-us/archive/blogs/cbrumme/size-of-a-managed-object

其他回答

非托管对象:

Marshal.SizeOf(object yourObj);

值类型:

瓦尔sizeof(对象)

管理对象:

看起来没有直接的方法来获取托管对象,参考: https://learn.microsoft.com/en-us/archive/blogs/cbrumme/size-of-a-managed-object

我不认为你可以直接得到它,但有一些方法可以间接地找到它。

一种方法是使用GC。方法来测量创建对象之前和之后使用的内存量。这并不完美,但只要控制了应用程序的其余部分,就可以获得感兴趣的信息。

除此之外,您可以使用分析器获取信息,也可以使用分析api在代码中获取信息。但我认为这并不容易使用。

参见找出c#中的对象正在使用多少内存?对于类似的问题。

调试模式

负载SOS

并执行dumpheap命令。

这可能不准确,但对我来说已经足够接近了

long size = 0;
object o = new object();
using (Stream s = new MemoryStream()) {
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(s, o);
    size = s.Length;
}

下面的代码片段应该返回传递给它的任何对象的字节大小,只要它可以序列化。 我从Quixant的一位同事那里得到这个工具,以解决在游戏平台上写入SRAM的问题。希望能有所帮助。 感谢卡洛·维图奇。

/// <summary>
/// Calculates the lenght in bytes of an object 
/// and returns the size 
/// </summary>
/// <param name="TestObject"></param>
/// <returns></returns>
private int GetObjectSize(object TestObject)
{
    BinaryFormatter bf = new BinaryFormatter();
    MemoryStream ms = new MemoryStream();
    byte[] Array;
    bf.Serialize(ms, TestObject);
    Array = ms.ToArray();
    return Array.Length;
}