Grundlagen der verteilten Garbage-Collection

Das RMI-Subsystem implementiert eine verteilte Garbage-Collection auf Basis einer Verweiszählung, um damit für ferne Serverobjekte automatische Funktionen zur Speicherverwaltung zur Verfügung zu stellen.

Wenn der Client einen fernen Verweis erstellt (Unmarshaling), ruft er in der serverseitigen verteilten Garbage-Collection die Methode dirty() auf. Sobald der Client die Verarbeitung des fernen Verweises abgeschlossen hat, ruft er die entsprechende clean()-Methode auf.

Der Client, dem der Verweis zugeordnet ist, erhält für eine gewisse Zeit eine Zugangsberechtigung für den Verweis. Der Zeitraum der Zugangsberechtigung beginnt ab dem Empfang des dirty()-Aufrufs. Der Client muss die Zugangsberechtigung verlängern, indem er vor deren Ablauf weitere dirty()-Aufrufe für die fernen ihm zugeordneten Verweise ausgibt. Wird die Zugangsberechtigung vom Client nicht vor dem Ablauf verlängert, wird vom verteilten Garbage-Collector angenommen, dass von diesem Client nicht länger auf das ferne Objekt verwiesen wird.

DGCClient dient zur Implementierung der Clientseite des verteilten Garbage-Collection-Systems bei RMI. Die externe Schnittstelle zum DGCClient ist die Methode registerRefs(). Wenn ein LiveRef auf ein fernes Objekt die JVM erreicht, muss es bei DGCClient registriert werden, damit es an der verteilten Garbage-Collection beteiligt wird. Sobald das erste LiveRef auf ein bestimmtes fernes Objekt registriert wird, wird an die serverseitige verteilte Garbage-Collection für das ferne Objekt ein dirty()-Aufruf ausgegeben. Der Aufruf liefert eine Zugangsberechtigung, mit der für einen gewissen Zeitraum garantiert wird, dass das ferne Objekt von der serverseitigen verteilten Garbage-Collection nicht erfasst wird. Solange LiveRef-Instanzen für ferne Objekte auf einem bestimmten Server vorhanden sind, werden von DGCClient in bestimmten Zeitabständen weitere dirty-Aufrufe gesendet, um die Zugangsberechtigung zu verlängern. Die lokale Verfügbarkeit registrierter LiveRef-Instanzen wird von DGCClient mithilfe von Phantomverweisen überwacht. Wenn für die LiveRef-Instanz für ein bestimmtes fernes Objekt eine lokale Garbage-Collection ausgeführt wird, wird an die serverseitige verteilte Garbage-Collection ein clean()-Aufruf ausgegeben. Der Aufruf gibt an, dass der Server das ferne Objekt nicht für diesen Client aufrechterhalten muss. Mit der Methode 'RenewCleanThread' werden die asynchronen clientseitigen Aktivitäten zur verteilten Garbage-Collection verarbeitet, indem die Zugangsberechtigungen verlängert und clean-Aufrufe ausgeführt werden. Dieser Thread wartet also bis zur nächsten Verlängerung der Zugangsberechtigung oder bis ein Phantomverweis zum Generieren der erforderlichen clean-Anforderungen in die Warteschlange gestellt wird.