#garbage-collection
#сборка мусора
Вопрос:
Я разрабатываю распределенную систему, которая должна поддерживать граф распределенных объектов, где объекты могут указывать на другие объекты, некоторые из которых могут находиться на удаленных компьютерах. Также должна быть возможность перемещать объекты с одного компьютера на другой.
Это вызывает две взаимосвязанные проблемы:
- Как мы узнаем, когда собирать объекты из мусора безопасно?
- Если мы перемещаем объект, как мы можем надежно гарантировать, что все ссылки на него обновляются?
Первоначальная мысль заключается в том, чтобы поддерживать исчерпывающий список всех входящих ссылок.
Конечно, одного этого недостаточно для сборки мусора, поскольку он не будет перехватывать циклические ссылки (та же проблема, что и при сборках мусора с подсчетом ссылок).
Однако этот список можно использовать для обеспечения того, чтобы любой удаленный компьютер со ссылками на объект мог получать уведомления о перемещении объекта.
Другая мысль заключается в том, что если объект перемещается, он оставляет после себя «хлебную крошку» на своем исходном компьютере. Если компьютер получает сообщение, предназначенное для объекта, которого больше нет, его можно перенаправить в его новое местоположение.
Однако хранить такие ссылки бесконечно невозможно, как мы узнаем, когда их безопасно удалять?
Кто-нибудь может предоставить указания на существующие решения этой проблемы, особенно те, которые также касаются проблем репликации и параллелизма?
Ответ №1:
Наиболее известное решение на Java реализовано как часть спецификации RMI.
Смотрите Сборка мусора удаленных объектов amp; Распределенная сборка мусора