Date: Thu, 9 Sep 99 21:15:29 JST From: SHUDO Kazuyuki Subject: [JavaHouse-Brewers:27853] asynchronous GC thread To: java-house-brewers at java-house.etl.go.jp (JavaHouse Brewers ML) Message-Id: <199909091213.VAA26309@cafe.muraoka.info.waseda.ac.jp> 首藤です。 以下、断りがない限り、 UNIX 系統の OS (Solaris や Linux や FreeBSD や…) を前提とします。 面白いことに気付きました。 JDK のバージョン、production release か reference implementation かによって (*1) 、非同期 (asynchronous) GC のた めのスレッドがあったりなかったりします。 (*1) production release と reference impl. の違いはここでは割愛します。 Sun の Java 仮想マシン (JVM) は、SIGQUIT (というシグナル) (*2) を受け取ると、その時点で JVM 中に存在するスレッドの一覧、 つまりダンプを標準エラー出力に出力します。 (*2) 私の手もとでは Control + \ で SIGQUIT を送ることができるように なっています。これは stty -a というコマンドで調べられます。 ある JDK では "Async Garbage Collector" という名前の、 非同期 GC をするスレッドがいつもあります。 しかし、ある JDK では、このスレッドがありません。 例) Full thread dump: … "Async Garbage Collector" (TID:0x2b108258, sys_thread_t:0x2be2be0c, state:CW) prio=1 何種類かの JDK を試したところ、非同期 GC のスレッドの有無は JDK 1.1 reference impl. : 有 JDK 1.1 production release : 無 JDK 1.2 reference impl. : 無 となっていました。 試したのは以下の JDK です。() 内は java -fullversion の出力です。 reference impl.: JDK 1.2.2 for Solaris JDK 1.1.8 for Solaris JDK 1.1.7 for Linux (Linux_JDK_1.1.7B_v3_green_threads) JDK 1.1.8 for FreeBSD (jdk1.1.8-FreeBSD:1999/7/19) production release: JDK 1.1.7 for Solaris, production release. (Solaris_JDK_1.1.7_08) JDK 1.2 の production release や HotSpot VM は試していません。 JDK 1.1 の production release が非同期 GC のスレッドを起 動しない理由はわかる気がします。Solaris 用の JDK production release は Ole Agesen が実装した Exact VM (EVM) を採用しています。EVM の GC は Exact GC といって、 conservative GC を避けるために、コード上のある時点でスタッ クに積まれているものの型を表として持ちます。この表はコー ド中の限られた時点についてのみ持つので、非同期にやたらと GC が起きては困るはずです。 JDK 1.2 で非同期 GC のスレッドがないのはなぜでしょう。 非同期 GC 自体、無くなってしまったのでしょうか。 何かご存知の方いらっしゃいませんでしょうか。 ちなみに、java -verbosegc (JDK 1.1 の場合) とか java -verbose:gc (JDK 1.2) とすることで、 GC が動作する様子が出力されます。 ついでに、JDK 1.2 でクラスの回収が確認できません。 JDK 1.2 でクラスは回収され得るのでしょうか。 SHUDO Kazuyuki/首藤一幸 私をたばねないで あらせいとうの花のように shudoh at muraoka.info.waseda.ac.jp