Объекты для сбора мусора, пересекающие границу AppDomain - PullRequest
4 голосов
/ 18 октября 2010

Когда вы передаете объект, который унаследован от MarshalByRefObject, в другой домен приложения, GC.Collect (), вызванный созданным им доменом приложения, не будет собирать объект при условии, что к моменту GC объект не имеет корня ни в одном из доменов приложения. .Collect () вызвал?

[Когда я говорю, что не укоренился, я имею в виду, что никакой код, написанный разработчиком, больше не имеет к нему доступа.]

Похоже, что объект не собирается, а превращается в следующее поколение!

Но если я перестану передавать объект в другой домен приложений, он будет получен, как и ожидалось.

Это поведение задумано? Если это обоснование?

Спасибо, ребята,

* * 1012 P.S. Я знаю, что GC.Collect () в коде плох по многим причинам, я просто пытаюсь понять, как GC будет происходить в MBRO.

1 Ответ

2 голосов
/ 19 октября 2010

Как вы упомянули, объекты MBRO трудно отследить для gc. Так что MS реализовал свое поведение немного по-другому.
Эти объекты имеют два свойства: их начальное время жизни (я думаю, пять минут) и RenewOnCallTime (две минуты). Если объект MBRO создан, у него есть начальное время жизни. Если это время равно нулю, оно помечается как gc.
Каждый вызов объекта позволяет объекту жить для RenewOnCallTime дольше (если оставшееся время жизни меньше, чем RenewOnCallTime).

Например (5 минут начального срока службы, 2 минуты RenewOnCallTime):
Объект создан: время жизни пять минут;
Пройти 4 минуты; Время жизни - одна минута;
Вызов объекта сделан; Время жизни две минуты;
Проход 2 минуты;
Объект помечен для gc, время жизни не осталось;

Где-то в MSDN есть отличная статья об этом (которую я сейчас не могу найти: /)

...