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