垃圾收集对象跨越AppDomain边界

时间:2010-10-18 05:35:06

标签: c# garbage-collection appdomain marshalbyrefobject

当您将从MarshalByRefObject继承的对象传递给其他AppDomain时,由创建它的AppDomain引发的GC.Collect()不会收集该对象,前提是该对象在GC时间之前未在任一AppDomain中生根.Collect()调用?

[当我说没有根源时,我的意思是没有开发人员编写代码再访问它。]

看来该对象没有被收集,而是被提升为下一代!

但是如果我停止将对象传递给diff AppDomain,它就会按预期收集。

这种行为是否符合设计要求?如果是这样理由?

谢谢你们,

P.S。我知道代码中的GC.Collect()有很多原因,我只是想了解GC将如何发生在MBRO上。

1 个答案:

答案 0 :(得分:2)

如你所述,MBRO对象很难跟踪gc。所以MS实施他们的行为有点不同 这些对象有两个属性:初始生命周期(我想五分钟)和RenewOnCallTime(两分钟)。如果创建了MBRO对象,则它具有初始生命周期。一旦此时间为零,则标记为gc 对象上的每次调用都允许对象为RenewOnCallTime存活更长时间(如果剩余生命周期小于RenewOnCallTime)。

例如(5分钟初始寿命,2分钟RenewOnCallTime):
创建对象:生命周期为五分钟;
4分钟过去;寿命是一分钟;
打电话给对象;寿命是两分钟;
2分钟过去;
对象标记为gc,没有生命周期;

在MSDN的某个地方有一篇很棒的文章(我现在找不到:/)