【发布时间】: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