如何告诉GC清理嵌入对象?

时间:2010-07-21 17:10:40

标签: c# .net

我们有一个事件类,它有一个MsgBody类的引用:

public class StatusEvent
{
   MsgBody msgBody;
   public StatusEvent(MsgBody body)
   {
       msgBody = body;
   }
....
}

public class MsgBody
{
   string s1;
   string s2;
.....

}

MsgBody类仅由StatusEvent使用。没有其他地方MsgBody被提及。创建StatusEvent实例时,将创建MsgBody实例。当StatusEvent对象准备好进行清理时,MsgBody对象可以安全地进行清理。

但结果是MsgBody清理落后于StatusEvent。从一个分析器结果中,我发现只有43个StatusEvent的实例,但有9,940个MsgBody个实例!

有没有办法将它们链接在一起,并在GC擦除时MsgBody清除StatusEvent

感谢,

4 个答案:

答案 0 :(得分:1)

如果您想要确定性地释放资源,StatusEvent需要实现IDisposable。在IDisposable.Dispose方法实现中,您可以释放所有持有的资源。在你的情况下你可以把语句msgBody = null;你的代码。

你确定没有其他地方存放msgBody吗?

答案 1 :(得分:0)

通常情况下,只要在其他地方需要内存,GC就会自动释放内存。但是如果你想加快速度,你可以调用以下内容来免费释放内存:

http://msdn.microsoft.com/en-us/library/system.gc.collect.aspx

答案 2 :(得分:0)

如果MsgBody没有任何昂贵的资源访问权限,那么一旦对象超出范围,GC就会小心。您可以设置msgBody=null;

答案 3 :(得分:0)

如果你不调用GC.Collect(),那么它将完全依赖于GC。我认为没有办法按照你想要的方式指导GC。