ORACLE JAPAN Server Release 6.1

 

  |  

  WebLogic Server ホーム   |     jCOM リファレンス   |   前へ   |   次へ   |   目次   |   索引   |   PDF 版

ガベージ コレクションと参照カウント

 

 


Java クライアントから参照される COM オブジェクト

Java 仮想マシンは、COM オブジェクトの Java 参照がこれ以上アクセスされない場合、その参照に対してガベージ コレクションを実行します。

こうした参照にガベージ コレクションを行うと、WebLogic jCOM はその DCOM オブジェクトの詳細を、解放される DCOM オブジェクト参照の内部リストに追加します。WebLogic jCOM デーモン スレッドは、ガベージ コレクションによって 10 秒ごとにこれらの DCOM オブジェクト参照を解放します。

オブジェクト参照を手動で明示的に解放する場合は、com.bea.jcom.Cleaner.release(...) メソッドを呼び出して、そのオブジェクト参照をパラメータとして渡します。

JVM がシャットダウンするときに、com.bea.jcom.Cleaner.releaseAll() を呼び出す必要があります。これにより、ガベージ コレクションでまだ解放されていない COM オブジェクト参照がすべて解放されます。このメソッドを呼び出したら、WebLogic jCOM を介してアクセスした COM オブジェクトを使用することができなくなります。

DCOM モードで動作している場合、WebLogic jCOM ランタイムは DCOM プロトコルに従って DCOM ping メッセージを送信して、クライアントがまだ応答していることを COM サーバに知らせます。

 


COM クライアントから参照される Java オブジェクト

COM クライアントが Java オブジェクトの参照を保持している場合、WebLogic jCOM ランタイムは COM クライアントに代わってその Java オブジェクトの参照を JVM 内部に保持します。また、Java オブジェクトにエクスポートされた COM 参照の数のカウントを保持し、COM 参照カウントがゼロになるとその参照を解放します。DCOM モードで動作している場合、WebLogic jCOM は、COM クライアントがまだ応答していることを知らせる DCOM ping メッセージを受信します。この ping メッセージが(DCOM 仕様に従って)6 分間受信されない場合、WebLogic jCOM ランタイムは ping されないすべての Java オブジェクトを解放します。

Java オブジェクトが COM クライアントによって参照されなくなったときに通知を受け取るようにしたい場合、次のメソッドを呼び出して、com.bea.jcom.Unreferenced インタフェースを実装する Java クラスのインスタンスの参照を渡します。

com.bea.jcom.Cleaner.addUnreferencedListener(com.bea.jcom.Unreferenced listener)

Unreferenced インタフェースは次のようになります。

public interface Unreferenced {
public void objectUnreferenced(Object o);
}

通知が必要でなくなったときは、次のメソッドを呼び出します。

public static void removeUnreferencedListener(Unreferenced listener)

次に小さい例を示します。

public class MyJvm {

public static void main(String[] args) throws Exception { com.bea.jcom.Jvm.register("firstjvm");

MyUnreferencedListener l = new MyUnreferencedListener(); com.bea.jcom.Cleaner.addUnreferencedListener(l);

Thread.sleep(6000000); // 1 時間の休止

com.bea.jcom.Cleaner.removeUnreferencedListener(l);
}
}

class MyUnreferencedListener implements com.bea.jcom.Unreferenced {
public void objectUnreferenced(Object o) {
System.out.println("** Object no longer referenced: " + o);
}
}

 

back to top previous page next page