无法获取托管对象的大小,它因实现而异。
有关详细信息,请参阅此链接:托管对象的大小
对于不准确的估计,您可以尝试GC.GetTotalMemory(false)
在 HashTable 初始化之前和填充数据之后立即使用:
Console.Write("How many entries would you like to store in the Hashtable?:");
int hashTableEntries;
int.TryParse(Console.ReadLine(), out hashTableEntries);
var memBeforeHashInit = GC.GetTotalMemory(true);
var hashTable = new Hashtable();
for (int i = 0; i < hashTableEntries; i++)
hashTable.Add(i, i);
var memAfterHashInit = GC.GetTotalMemory(false);
var diff = memAfterHashInit - memBeforeHashInit;
Console.WriteLine("Memory used since startup: {0} bytes" +
"\r\n" +
"Hashtable entries: {1}" +
"\r\n" +
"Press any key to exit", diff, hashTableEntries);
Console.ReadLine();
看起来,一旦 Hashtable 被初始化,8192 字节被分配到内存中,它也似乎为它的 64 个元素分配内存,每个元素分配 128 个字节。一旦您将第 65 个元素添加到 Hashtable,它就会为另外 64 个元素保留另外 8192 个字节。
在另一个系统上可能会有所不同,由 CLR 决定:)