Ran*_*anC 5 c# garbage-collection appdomain marshalbyrefobject
当您将从 MarshalByRefObject 继承的对象传递给不同的 AppDomain 时,创建该对象的 AppDomain 引发的 GC.Collect() 不会收集该对象,前提是该对象在 GC.Collect( 时未植根于任一 AppDomain 中) )叫?
[当我说没有 root 时,我的意思是开发人员编写的代码不再访问它。]
看来该对象并没有被收集,而是被提升到了下一代!
但是,如果我停止将对象传递给 diff AppDomain,它就会按预期被收集。
这是设计使然吗?如果有的话有什么道理吗?
多谢你们,
PS 我知道代码中的 GC.Collect() 出于多种原因是不好的,我只是想了解 GC 如何在 MBRO 上发生。
正如您提到的,GC 很难跟踪 MBRO 对象。所以 MS 的行为有点不同。
这些对象有两个属性:它们的初始生命周期(我认为是五分钟)和 RenewOnCallTime(两分钟)。如果创建了 MBRO 对象,它就有其初始生命周期。一旦这个时间为零,它就会被标记为GC。
对对象的每次调用都允许对象的 RenewOnCallTime 生存时间更长(如果剩余生存期小于 RenewOnCallTime)。
举个例子(5分钟初始生命周期,2分钟RenewOnCallTime):
对象创建:生命周期为五分钟;
4分钟过去了;一生是一分钟;
调用对象;生命周期是两分钟;
2分钟过去了;
对象被标记为GC,没有剩余生命周期;
MSDN 上有一篇关于此的很棒的文章(我现在找不到:/)
| 归档时间: |
|
| 查看次数: |
1330 次 |
| 最近记录: |