Поиск

Немного истории

Несколько лет назад, в самом начале работы над проектом .NET, активно дебатировалась проблема управления ресурсами. Первые участники создания .NET пришли из команд, занятых в разработке COM, Microsoft Visual Basic и из др. Одной из самых серьезных была проблема способа подсчета ссылок, включая циклы и ошибки, возникающие при их неверном использовании. Примером может служить проблема циклических ссылок, когда в одном объекте содержится ссылка на другой объект, содержащий обратную ссылку на первый. Вопрос в том, когда и как один из них освободит циклическую ссылку. Если не освободить одну или обе ссылки, возникает утечка памяти, обнаружить которую чрезвычайно трудно. Каждый, кому привелось много работать с СОМ, может рассказать массу историй о срыве графиков из-за времени, затраченного на "отлов" ошибок, возникших при подсчете ссылок. Отдавая отчет в том, что проблемы подсчета ссылок довольно обычны для приложений, основанных на компонентах (таких как СОМ-приложения), Microsoft выступила с тем, чтобы в .NET предоставить универсальное решение.

Первоначальное решение было основано на автоматическом подсчете ссылок. Это решение также включало в себя методы автоматического обнаружения и обработки циклов. Кроме того, команда .NET рассмотрела возможность добавления сбора установившихся (conservative) ссылок, трассировки и алгоритмов GC, которые могли бы подобрать единственный объект, не выполняя трассировки всего графа объекта. Но в силу всяких причин — ниже я остановлюсь на различных подходах — было решено, что в типичном случае не будут задействованы все эти решения.

Одним из крупных препятствий на заре разработки .NET была необходимость поддержания высокой степени совместимости с Visual Basic. Поэтому решение должно быть полным и прозрачным без изменения семантики самого языка Visual Basic. Окончательным решением стала модель на основе контекста, в которой все, что существует в определенном контексте, использует подсчет ссылок поверх GC, а все, что вне, будет использовать только GC. Это на самом деле помогло справиться с некоторыми проблемами при разветвлении (см. ниже), но не дало хорошего решения при использовании кода на разных языках. Итак, было принято решение внести серию изменений в язык Visual Basic, чтобы модернизировать его и придать ему дополнительные возможности. Частью этого решения стал отказ от совместимости с требованиями Visual Basic ко времени жизни. Оно также в общем положило конец исследованиям в области проблем детерминированного времени жизни.