我们有一个事件类,它有一个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
?
感谢,
答案 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。