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