2010-11-05 4 views
18

Я обнаружил, что мне нужно написать код VBA в последнее время, и просто задавался вопросом, не встретил ли кто-нибудь какие-либо подробности о том, как работает сборщик мусора VBA? Протокол .Net GC очень хорошо документирован, но я не могу найти ни одного фрагмента деталей на VBA GC, кроме этого неопределенного упоминания, что это счетчик ссылок. Я предполагаю, что он очень похож на VB6 GC, но не может найти никакой информации об этом.VBA Garbage Collector Details

В частности, мне было бы интересно узнать: (? Это коллекция поколений, например)

  • Что вызывает GC
  • Какой алгоритм использует
  • Как (если вообще) делает он обрабатывает круговые ссылки?
  • Есть ли способ мониторинга его работы

Это больше из любопытства, чем какой-либо особой необходимости знать, любое понимание вообще ценится!

+2

Ответ Konrad - это все, что вам нужно, но я также укажу вам на Руководство программиста VB, в частности раздел «Объектные модели», в котором обсуждаются подсчет ссылок, «методы tearDown» и т. П.: Http: // msdn.microsoft.com/en-us/library/aa263491(v=VS.60).aspx – jtolle

ответ

14

Предполагается, что VBA является еще с использованием того же механизма сбора мусора, который используется в VB6 (что, вероятно, и есть).

VB6 использовал контрольный GC. GC инициируется детерминированным образом, когда последняя ссылка на данный объект установлена ​​на Nothing. Установка локальных ссылок на Nothing не требуется, так как они выходят за рамки.

Каждый объект реализует COM-интерфейс, который выполняет учетный счет для этого объекта. Каждое присваивание ссылки на объект обновляет опорные счетчики задействованных ссылок (то есть счетчик старого объекта, который ранее ссылался, уменьшается, а счетчик нового объекта увеличивается). Объектом является сбор мусора, когда его счетчик ссылок достигает 0.

Объекты в круглых ссылках, таким образом, никогда не собираются в течение всего срока службы приложения VBA. Более того, VBA не предлагает способ разбить круговые ссылки. В VB6 слабые ссылки могут быть реализованы через функции WinAPI.

+1

«Настройка локальных ссылок на« Ничто »не требуется, это происходит по мере выхода из сферы действия». <- Это должно быть нанесено на татуировку внутри веков разработчика VBA/VB6! – Lunatik

+0

@ Lunatik - Согласен! Количество сообщений, которые я нашел при поиске информации GC, которые говорят «Лучше всего устанавливать ссылки на ничего», действительно ужасно. –

+5

@Jon: К сожалению, этот слух не является полностью необоснованным. У VB6, похоже, была ошибка, которая могла вызвать некоторые зависающие ссылки в переменных-членах класса (хотя и не в локальных переменных). Я не знаю, был ли когда-либо обнаружен точный источник этой ошибки, но стало обычной практикой использовать метод Class_Terminate для того, чтобы установить всех членов в «Nothing». –

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