跨 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 边界的垃圾收集对象的主要内容,如果未能解决你的问题,请参考以下文章

垃圾收集是在进程级别还是 appdomain 级别发生的?

JVM 垃圾收集算法

java虚拟机--垃圾收集

67.Java垃圾收集机制对象引用垃圾对象的判定垃圾收集算法标记—清除算法标记—整理算法分代收集垃圾收集器性能调优

JVM垃圾收集机制

JVMJVM垃圾收集器垃圾收集算法无用对象