Как мне отслеживать ссылки в графе распределенных объектов?

#garbage-collection

#сборка мусора

Вопрос:

Я разрабатываю распределенную систему, которая должна поддерживать граф распределенных объектов, где объекты могут указывать на другие объекты, некоторые из которых могут находиться на удаленных компьютерах. Также должна быть возможность перемещать объекты с одного компьютера на другой.

Это вызывает две взаимосвязанные проблемы:

  • Как мы узнаем, когда собирать объекты из мусора безопасно?
  • Если мы перемещаем объект, как мы можем надежно гарантировать, что все ссылки на него обновляются?

Первоначальная мысль заключается в том, чтобы поддерживать исчерпывающий список всех входящих ссылок.

Конечно, одного этого недостаточно для сборки мусора, поскольку он не будет перехватывать циклические ссылки (та же проблема, что и при сборках мусора с подсчетом ссылок).

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

Другая мысль заключается в том, что если объект перемещается, он оставляет после себя «хлебную крошку» на своем исходном компьютере. Если компьютер получает сообщение, предназначенное для объекта, которого больше нет, его можно перенаправить в его новое местоположение.

Однако хранить такие ссылки бесконечно невозможно, как мы узнаем, когда их безопасно удалять?

Кто-нибудь может предоставить указания на существующие решения этой проблемы, особенно те, которые также касаются проблем репликации и параллелизма?

Ответ №1:

Наиболее известное решение на Java реализовано как часть спецификации RMI.

Смотрите Сборка мусора удаленных объектов amp; Распределенная сборка мусора