我需要知道我的对象在内存中消耗多少字节(在c#中)。例如我的哈希表,或SortedList,或List<String>。
当前回答
调试模式
负载SOS
并执行dumpheap命令。
其他回答
下面的代码片段应该返回传递给它的任何对象的字节大小,只要它可以序列化。 我从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;
}
我不认为你可以直接得到它,但有一些方法可以间接地找到它。
一种方法是使用GC。方法来测量创建对象之前和之后使用的内存量。这并不完美,但只要控制了应用程序的其余部分,就可以获得感兴趣的信息。
除此之外,您可以使用分析器获取信息,也可以使用分析api在代码中获取信息。但我认为这并不容易使用。
参见找出c#中的对象正在使用多少内存?对于类似的问题。
这可能不准确,但对我来说已经足够接近了
long size = 0;
object o = new object();
using (Stream s = new MemoryStream()) {
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(s, o);
size = s.Length;
}
调试模式
负载SOS
并执行dumpheap命令。
非托管对象:
Marshal.SizeOf(object yourObj);
值类型:
瓦尔sizeof(对象)
管理对象:
看起来没有直接的方法来获取托管对象,参考: https://learn.microsoft.com/en-us/archive/blogs/cbrumme/size-of-a-managed-object
推荐文章
- 为什么MYSQL的高LIMIT偏移量减慢查询?
- 将XML字符串转换为对象
- ToList()——它是否创建一个新列表?
- SQL JOIN vs IN性能?
- .NET中的闭包是什么?
- 连接网络共享时,如何提供用户名和密码
- ProcessStartInfo挂在“WaitForExit”?为什么?
- 窗口vs页面vs用户控件的WPF导航?
- 重新定位解决方案从。net 4.0到4.5 -如何重新定位NuGet包?
- CultureInfo。InvariantCulture意味着什么?
- Task和Task的区别是什么?启动/等待和异步/等待?
- 如何实现规则引擎?
- 该类型必须是引用类型,以便在泛型类型或方法中使用它作为参数'T'
- 将字符串数组转换为字符串
- 如何将linq结果转换为哈希集或哈希集