0

我在 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()?

4

1 回答 1

0

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

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

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

于 2012-12-13T13:43:01.883 回答