当您将从MarshalByRefObject继承的对象传递给其他AppDomain时,由创建它的AppDomain引发的GC.Collect()不会收集该对象,前提是该对象在GC时间之前未在任一AppDomain中生根.Collect()调用?
[当我说没有根源时,我的意思是没有开发人员编写代码再访问它。]
看来该对象没有被收集,而是被提升为下一代!
但是如果我停止将对象传递给diff AppDomain,它就会按预期收集。
这种行为是否符合设计要求?如果是这样理由?
谢谢你们,
P.S。我知道代码中的GC.Collect()有很多原因,我只是想了解GC将如何发生在MBRO上。
答案 0 :(得分:2)
如你所述,MBRO对象很难跟踪gc。所以MS实施他们的行为有点不同 这些对象有两个属性:初始生命周期(我想五分钟)和RenewOnCallTime(两分钟)。如果创建了MBRO对象,则它具有初始生命周期。一旦此时间为零,则标记为gc 对象上的每次调用都允许对象为RenewOnCallTime存活更长时间(如果剩余生命周期小于RenewOnCallTime)。
例如(5分钟初始寿命,2分钟RenewOnCallTime):
创建对象:生命周期为五分钟;
4分钟过去;寿命是一分钟;
打电话给对象;寿命是两分钟;
2分钟过去;
对象标记为gc,没有生命周期;
在MSDN的某个地方有一篇很棒的文章(我现在找不到:/)