我在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()
?
答案 0 :(得分:0)
在大多数情况下,您不必调用GC.Collect()。 To GC.Collect or not?
我有类似的场景,我刚刚创建了一个限于n个条目的字典,我自己在ConcurrentDictionary上做了这个,但是你可以使用BlockingCollection。
一个可能的优点是,如果同时添加100万个条目,除了n之外的所有条目都可用于垃圾收集而不是30秒之后。