Spec-Zone .ru
спецификации, руководства, описания, API
|
СОДЕРЖАНИЕ | ПРЕДЫДУЩИЙ | NEXT | Java Удаленный Вызов метода |
Чтобы выполнить сборку "мусора" подсчета ссылок, время выполнения RMI отслеживает все живые ссылки в пределах каждой виртуальной машины Java. Когда живая ссылка вводит виртуальную машину Java, ее подсчет ссылок постепенно увеличивается. Первая ссылка на объект отправляет сообщение, на которое "ссылаются", серверу для объекта. Поскольку на живые ссылки, как находят, нессылаются в локальной виртуальной машине, количество постепенно уменьшается. Когда последняя ссылка была отброшена, сообщение, на которое нессылаются, отправляется серверу. Много тонкости существуют в протоколе; большинство из них связывается с поддержанием упорядочивания на которые ссылаются и сообщений, на которые нессылаются, чтобы гарантировать, что объект преждевременно не собирается.
Когда на удаленный объект не ссылается никакой клиент, время выполнения RMI обращается к нему использующий слабую ссылку. Слабая ссылка позволяет сборщику "мусора" виртуальной машины Java отбрасывать объект, если никакие другие локальные ссылки на объект не существуют. Распределенный алгоритм сборки "мусора" взаимодействует со сборщиком "мусора" локальной виртуальной машины Java обычными способами, содержа нормальные или слабые ссылки на объекты.
Пока локальная ссылка на удаленный объект существует, она не может быть собрана "мусор", и ее можно передать в удаленных вызовах или возвращена клиентам. Передача удаленного объекта добавляет идентификатор для виртуальной машины, к которой это передали к набору, на который ссылаются. Удаленный объект, нуждающийся в уведомлении, на которое нессылаются, должен реализовать java.rmi.server.Unreferenced
интерфейс. Когда те ссылки больше не существуют, unreferenced
метод будет вызван. unreferenced
вызывается, когда набор ссылок, как находят, пуст, таким образом, его можно было бы вызвать не раз. Удаленные объекты только собираются, когда больше ссылок, или локальных или удаленных, все еще не существует.
Отметьте, что, если сетевой раздел существует между клиентом и объектом удаленного сервера, возможно, что преждевременный набор удаленного объекта произойдет (так как транспорт мог бы полагать что разрушенный клиент). Из-за возможности преждевременного набора удаленные ссылки не могут гарантировать ссылочную целостность; другими словами всегда возможно, что удаленная ссылка, возможно, не фактически обращается к существующему объекту. Попытка использовать такую ссылку генерирует a RemoteException
который должен быть обработан приложением.