Index: [Article Count Order] [Thread]

Date:  Mon, 02 Feb 2004 19:17:04 +0900 (JST)
From:  Tsuyoshi FUKUI <tfukui@....jp>
Subject:  [XP-jp:04870] Re: メモリの状態をテストするには
To:  extremeprogramming-jp@....jp
Message-Id:  <20040202.191704.85397169.tfukui@....jp>
In-Reply-To:  <401E162E.1050408@....com>
References:  <200401300347.i0U3lPH11955@....jp>	<4019E66A.4020305@....com>	<401E162E.1050408@....com>
X-Mail-Count: 04870

フクイです。

Mika Ohtsuki <mika@....com>'s message
	at Mon, 02 Feb 2004 18:19:42 +0900
> 以前Javaでネットワークプログラミングをしたときに、お手本とした
> コードで、Vultureというクラスを作って、コネクションがきちんと終
> 了せずに残ってしまったコネクションを回収して削除するというのが
> ありました。大量のコネクションを張るプログラムだと馬鹿にならな
> いんだと思います。
> 
> それで、実装したのはいいのですが、このコードがちゃんと動いている
> のを確認するのにはどうすればいいのか、と思ったことがありました。
> 確認するにはJavaのGCの状況が覗けるといい、と思ったのですが可能に
> なってるかどうか分からなくて挫折しました。単に勉強不足なんだろう
> と思うのですが、できるのでしょうか。

java.lang.ref.WeakReference を使えばできます。
おおざっぱに言うと、Java の GC は WeakReference による参照以外の
参照が無くなったら、その対象のオブジェクトを回収してしまいます。
(正確なところは JavaDoc を読んでください)

動作のイメージはこんな感じです。

Object a = new Object();
Object b = a;
WeakReference ref = new WeakReference(a);
a = null;
b = null; // ここでオブジェクトは GC の対象となる
System.gc();
if (ref.get() == null) { // GC 実行後なので成り立つ
  System.out.println("オブジェクトは回収されました"); 
}

ReferenceQueue (GCされた時点で、回収されたオブジェクトを参照していた
WeakReference がこのキューに入れられる)と組み合わせれば、
テストはわりと簡単に書けると思います。

--
FUKUI Tsuyoshi