【问题标题】:Memory using by a Hashtable object in .Net.Net 中的 Hashtable 对象使用的内存
【发布时间】:2013-05-09 16:31:48
【问题描述】:

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

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 缓存中。如何通过代码找出这个哈希表对象占用的内存.....谢谢。

【问题讨论】:

标签: c# httpruntime.cache


【解决方案1】:

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

查看此链接了解更多详情:Size of a managed object

对于不准确的估计,您可以在 HashTable 初始化之前和填充数据之后尝试使用 GC.GetTotalMemory(false)

        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 决定:)

【讨论】:

  • 太棒了!很高兴我能帮上忙。
猜你喜欢
  • 2010-09-11
  • 1970-01-01
  • 2013-10-18
  • 2010-11-28
  • 2012-10-26
  • 2010-09-30
  • 2014-12-03
  • 2011-03-16
  • 2019-11-15
相关资源
最近更新 更多