【发布时间】:2009-11-29 22:22:36
【问题描述】:
愚蠢的问题,但在我目前正在开发的 winforms 应用程序中,我想获取内存中保存的 List<[SomeObject]> 分配/使用的字节数(用于统计目的)。这可能吗?我已经搜索了可能的选项,但显然没有myList.GetTotalBytes() 方法。
【问题讨论】:
愚蠢的问题,但在我目前正在开发的 winforms 应用程序中,我想获取内存中保存的 List<[SomeObject]> 分配/使用的字节数(用于统计目的)。这可能吗?我已经搜索了可能的选项,但显然没有myList.GetTotalBytes() 方法。
【问题讨论】:
这真的取决于你的意思。您可以预测列表本身将使用多少字节 - 但这与预测列表符合回收条件时有多少字节可能符合垃圾回收条件不同。
列表的位:
T[] - 对只有列表才能访问的数组的引用)棘手的一点是决定计算多少。每一个都很容易计算(特别是如果你知道 T 是一个引用类型,例如)但是你想计算列表中 referenced 的对象吗?这些参考文献是唯一的吗?
你说你想知道“出于统计目的”——你能更准确一点吗?如果您能说出您真正感兴趣的内容(以及有关列表中的内容以及是否可能存在对相同对象的其他引用的更多信息),我们可能会提供更多帮助。
【讨论】:
这可能是一个充满挑战的答案,但我会冒昧地说,如果您要进行统计比较,请将对象的二进制序列化为 MemoryStream 和然后查看它的Length 属性:
List<string> list = new List<string>
{
"This",
"is",
"a",
"test"
};
using (Stream stream = new MemoryStream())
{
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, list);
Console.WriteLine(stream.Length);
}
请注意,这可能会在不同版本的框架之间发生变化,并且仅对单个程序中的对象图之间的比较有用。
【讨论】:
我不确定运行时是否提供了一种可靠的编程方法来获取对象的大小,但是您可以使用一些选项:
【讨论】: