2010-10-18 2 views
4

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

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

Оказывается, что объект не получает собраны, а получать содействие следующему поколению!

Но если я прекратил передавать объект в diff AppDomain, он собирается, как ожидается.

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

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

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

ответ

2

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

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

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

+0

FGE, спасибо! ОК, похоже, что, хотя мы отсылаем ссылки на среду MBRO, она продолжает удерживать объекты через службы управления лизингами и лифтами. Я прочитаю больше об этих областях. – RanC

+0

Возможно, эта ссылка? http://msdn.microsoft.com/en-us/library/23bk23zc(v=vs.85).aspx – Spook

Смежные вопросы