【问题标题】:How to free memory on Dictionary in static class?如何在静态类中释放字典的内存?
【发布时间】:2012-12-13 11:37:55
【问题描述】:

我在 C# 中释放内存时遇到问题。我有一个包含静态字典的静态类,其中填充了对对象的引用。单个对象 zajumie 大量内存。有时我会通过删除对设置为 null 的对象的过时引用并从字典中删除该项目来释放内存。不幸的是,在这种情况下,内存并没有变慢,在达到系统中内存的最大大小后的时间就好像突然释放了未使用的资源并且正确使用的内存量减少了。 下面是类图:

public class cObj
{
    public DateTime CreatedOn;
    public object ObjectData;
}

public static class cData
{
    public static ConcurrentDictionary<Guid, cObj> ObjectDict = new ConcurrentDictionary<Guid, cObj>();
    public static FreeData()
    {
        foreach(var o in ObjectDict)
        {
            if (o.Value.CreatedOn <= DateTime.Now.AddSeconds(-30))
            {
                cObj Data;
                if (ObjectDict.TryGetValue(o.Key, out Data))
                {
                    Data.Status = null;
                    Data.ObjectData = null;
                    ObjectDict.TryRemove(o.Key, out Data);
                }
            }
        } 
    }
}

在这种情况下,内存被释放。但是,如果在此操作之后,我调用 GC.Collect (); 随后是未使用对象的预期释放。

如何解决问题,让你不用GC.Collect()

【问题讨论】:

  • a 来自哪里? ResultDict 是什么?
  • 对不起。已经更正了代码。
  • 一般来说,GC 会在必要时进行工作。无论如何,这是在 Silverlight 或其他平台上运行的吗?我相信他们倾向于以超出他们当前需要的块的形式请求内存分配,并保留它以供将来使用以提高性能。 (我可能在这方面错了,但我确信我是从某个地方的某个网站上读到的……)
  • 我在 WCF 服务中使用它。
  • 我听说使用GC.Collect() 是一种不好的做法。是这样吗,合理吗?

标签: c# wcf garbage-collection dictionary


【解决方案1】:

在大多数情况下,您不必调用 GC.Collect()。 To GC.Collect or not?

我有过类似的场景,我刚刚创建了一个限制为 n 个条目的字典,我自己在 ConcurrentDictionary 之上做了这个,但你可以使用 BlockingCollection。

一个可能的优势是,如果同时添加 100 万个条目,则除 n 之外的所有条目都将可用于垃圾回收,而不是 30 秒后。

【讨论】:

    猜你喜欢
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 2023-03-30
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多