Страницы

Поиск по вопросам

четверг, 4 октября 2018 г.

Время жизни объекта

В некотором блоке создан анонимный объект и объект в "слабой ссылке": //first object System.Random string result=new Random().Next(0,1)==1 ? "equal 1":"sory, but not equal 1";
//second object System.Random string result=((Random)new WeakReference(new Random()).Target).Next(0,1)==1 ? "equal 1":"sory, but not equal 1";
GC.Collect(); Вопрос: Какой из помеченных комментариями объектов имеет большие шансы остаться в живых после сборки мусора что вызванна явно в конце примера? Заранее спасибо.


Ответ

Хороший вопрос, но точного ответа на него, к сожалению, не существует. В стандарте языка нет четкого определения механизма работы GC.Collect() и семантики очистки объектов, обернутых слабыми ссылками. Т.е, если говорить кратко, то ответ - implementation specific, т.к, скажем, под некоторой сферической реализацией C# Runtime вызов GC.Collect() может вообще ничего не делать и это будет соответствовать стандарту. Если рассуждать чуть ближе к практике, то в этой ситуации оба из объектов Random будут помечены как возможные для удаления. Первый - по очевидным причинам, второй - т.к WeakReference будет указывать на объект, более не доступный ни по одному из codepath (да и сам объект WeakReference также оказывается недоступным после выхода из соответствующего блока). А вот что происходит дальше, уже implementation specific, т.к совершенно неизвестно, что GC будет делать с объектами, возможными для удаления. Он может отложить их на следующий вызов сборщика, может поместить в какую-либо свою дополнительную внутреннюю очередь и т.п. Возможен, разумеется, очевидный вариант, когда оба объекта просто будут удалены. Ситуация также осложняется тем, что оптимизатор может решить, что выгоднее аллокировать переменные Random на стеке, нежели в хипе. Что, естественно, делает вопрос о сборке мусора неактуальным.

Комментариев нет:

Отправить комментарий