跨 AppDomain 边界的垃圾收集对象
Posted
技术标签:
【中文标题】跨 AppDomain 边界的垃圾收集对象【英文标题】:Garbage collecting objects crossing AppDomain boundary 【发布时间】:2010-10-18 05:35:05 【问题描述】:当您将继承自 MarshalByRefObject 的对象传递给不同的 AppDomain 时,由创建它的 AppDomain 引发的 GC.Collect() 不会收集该对象,前提是该对象在 GC 时未植根于任一 AppDomain .Collect() 调用了吗?
[当我说没有植根时,我的意思是不再有开发人员编写的代码访问它。]
似乎该对象没有被收集,而是被提升到下一代!
但如果我停止将对象传递给 diff AppDomain,它将按预期收集。
这是设计使然吗?如果有理由呢?
谢谢大家,
附:我知道代码中的 GC.Collect() 不好有很多原因,我只是想了解 GC 将如何在 MBRO 上发生。
【问题讨论】:
【参考方案1】:正如您提到的,MBRO 对象很难为 gc 跟踪。所以 MS 实现了他们的行为有点不同。 这些对象有两个属性:它们的初始生命周期(我认为是五分钟)和 RenewOnCallTime(两分钟)。如果创建了一个 MBRO 对象,它就有它的初始生命周期。一旦这个时间为零,它就会被标记为 gc。 对对象的每次调用都允许对象在 RenewOnCallTime 内存活更长的时间(如果剩余的生命周期小于 RenewOnCallTime)。
例如(5 分钟初始生命周期,2 分钟 RenewOnCallTime): 对象已创建:生命周期为五分钟; 4分钟过去了;生命周期是一分钟; 调用对象;生命周期是两分钟; 2分钟过去了; 对象被标记为 gc,没有生命周期;
在 MSDN 上的某个地方有一篇很棒的文章(我现在找不到:/)
【讨论】:
Fge,谢谢!好的,看起来虽然我们删除了对 MBRO 运行时的引用,但仍然通过租约和提升时间管理服务来保留对象。我会详细了解这些领域。以上是关于跨 AppDomain 边界的垃圾收集对象的主要内容,如果未能解决你的问题,请参考以下文章