4

当您将继承自 MarshalByRefObject 的对象传递给不同的 AppDomain 时,创建它的 AppDomain 诱导的 GC.Collect() 不会收集该对象,前提是该对象在 GC.Collect( ) 叫什么?

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

似乎该对象没有被收集,而是被提升到下一代!

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

这种行为是设计使然吗?如果有道理呢?

多谢你们,

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

4

1 回答 1

2

正如您提到的,MBRO 对象很难为 gc 跟踪。所以 MS 实现了他们的行为有点不同。
这些对象有两个属性:它们的初始生命周期(我认为是五分钟)和 RenewOnCallTime(两分钟)。如果创建了一个 MBRO 对象,它就有它的初始生命周期。一旦这个时间为零,它就被标记为 gc。
对对象的每次调用都允许对象在 RenewOnCallTime 中存活更长的时间(如果剩余的生命周期小于 RenewOnCallTime)。

例如(5 分钟初始生命周期,2 分钟 RenewOnCallTime):
对象被创建:生命周期为 5 分钟;
4分钟过去了;一生是一分钟;
调用对象;寿命是两分钟;
2分钟过去;
对象被标记为 gc,没有生命周期;

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

于 2010-10-19T01:30:31.413 回答