Подтвердить что ты не робот

Информация о сборщике мусора VBA

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

В частности, мне было бы интересно узнать:

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

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

4b9b3361

Ответ 1

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

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

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

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