2

我们有一个 Web 应用程序,它使用 HttpRuntime 缓存来存储频繁使用的 DB 数据。代码片段是:

public static void Add(string cacheName, Hashtable cacheValue)
{
  System.Web.HttpRuntime.Cache.Add(cacheName, cacheValue, null, DateTime.Now.AddSeconds(60), TimeSpan.Zero, System.Web.Caching.CacheItemPriority.High, null);
}

这里一个哈希表对象从数据库接收数据并添加到 HttpRuntime 缓存中。如何使用代码找出此哈希表对象占用的内存.....谢谢。

4

1 回答 1

3

无法获取托管对象的大小,它因实现而异。

有关详细信息,请参阅此链接:托管对象的大小

对于不准确的估计,您可以尝试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 决定:)

于 2013-05-15T07:57:31.757 回答