目次 | 前の項目 | 次の項目 | Java Remote Method Invocation |
ローカルシステムにおけるのと同様に、分散システムにおいても、どのクライアントからも参照されなくなったリモートオブジェクトは、自動的に削除されるのが望ましいことです。これにより、プログラマは、リモートオブジェクトのクライアントを追跡して、適時にリモートオブジェクトを終了させるという作業をする必要がなくなります。RMI は、参照カウント方式の、Modula-3 の Network Objects に似たガベージコレクションアルゴリズムを採用しています (Birrell, Nelson, Owicki による次の文献を参照。『Network Objects』Digital Equipment Corporation Systems Research Center Technical Report 115, 1994)参照カウント方式ガベージコレクションを実行するために、RMI のランタイムは、各 Java Virtual Machine 内のライブ参照を常に監視しています。ライブ参照が Java Virtual Machine に入ってくると、参照カウントは増加します。あるオブジェクトへの最初の参照は「参照が起こった」ことを示すメッセージを、そのオブジェクトのサーバへ送ります。ライブ参照がローカルな Virtual Machine 内で参照されていないことがわかると、カウントは減少します。最後の参照が廃棄されると、「参照されていない」ことを示すメッセージがサーバに送られます。このプロトコルには微妙な点が数多くありますが、オブジェクトの不必要な回収が起こらないことを保障するためには、それらは大部分、参照が起こったこと、参照されていないことを示すメッセージの順序付けの管理に関連します。
リモートオブジェクトがどのクライアントからも参照されていない状態になると、RMI ランタイムは、そのオブジェクトを弱参照 (weak reference) によって参照します。 弱参照になると、Java Virtual Machine のガベージコレクタは、そのオブジェクトへのローカル参照が他に存在していない場合、オブジェクトを廃棄します。分散ガベージコレクションアルゴリズムは、オブジェクトへのノーマルな参照と弱参照を保持しながら、ローカル Java Virtual Machine のガベージコレクタと相互作用を続けます。
リモートオブジェクトへのローカルな参照が存在している間はガベージコレクトされることはなく、オブジェクトはリモート呼び出しに渡されたり、クライアントに返されたりします。リモートオブジェクトを渡すと、それが渡された Virtual Machine の識別子が参照セットへ追加書き込みされます。非参照の通知を必要とするリモートオブジェクトは java.rmi.server.Unreferenced インタフェースを実装しなければなりません。これらの参照が存在しなくなると、
unreferenced
メソッドが呼び出されます。unreferenced
は、参照セットが空であると呼び出されるため、複数回呼び出される場合があります。リモートオブジェクトが回収されるのは、リモートとローカルを含めて参照がまったくなくなった場合だけです。クライアントとリモートサーバの間にネットワークパーティションが存在すると、リモートオブジェクトのコレクションが早すぎる時期に起こる場合があります。これは、トランスポートが、クライアントがクラッシュしたと判断する可能性があるためです。時期尚早な回収の可能性があるため、リモート参照は、参照に関して完全な整合性を保証するものではありません。言い換えれば、リモート参照が実際に存在するオブジェクトを参照していない可能性が常にあるということです。このような参照を使おうとすると RemoteException が発生し、その取り扱いはアプリケーションが行わなければなりません。