gpt4 book ai didi

c# - 跨越 AppDomain 边界的垃圾收集对象

转载 作者:行者123 更新时间:2023-11-30 12:36:05 30 4
gpt4 key购买 nike

当您将一个从 MarshalByRefObject 继承的对象传递给另一个 AppDomain 时,创建它的 AppDomain 所诱导的 GC.Collect() 不会收集该对象,前提是该对象在 GC 时不在任何一个 AppDomain 中.Collect() 调用了吗?

[当我说没有 root 时,我的意思是没有开发人员编写的代码可以访问它了。]

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

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

这是设计使然的行为吗?如果是这样有道理吗?

谢谢大家,

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

最佳答案

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

举个例子(初始生命周期 5 分钟,RenewOnCallTime 2 分钟):
对象被创建:生命周期为五分钟;
4分钟过去;生命周期为一分钟;
调用对象;生命周期为两分钟;
2分钟过去;
对象被标记为 gc,没有剩余生命周期;

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

关于c# - 跨越 AppDomain 边界的垃圾收集对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3956792/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com