Date: Thu, 23 Sep 99 18:45:25 JST From: SHUDO Kazuyuki Subject: [JavaHouse-Brewers:28054] Re: JavaVM,GC,JNI To: java-house-brewers at java-house.etl.go.jp (JavaHouse Brewers ML) Message-Id: <199909230942.SAA25475@cafe.muraoka.info.waseda.ac.jp> 首藤です。 大野さん wrote: > JDK1.1のJavaVM、GC、及びJNIの動作について興味があり、2、3質問させて > ください。 > (1)クラス(バイトコード、クラス変数)がメモリ上にロードされているとし > ます。どのような条件が成立した場合に、不要なクラスと判断されて、GCに > よってメモリから削除されるのでしょうか? JDK 1.0.X と 1.1.X と 1.2.X で異なります。 JDK…というか Sun の JVM 以外でどうなっているかは知りません。 厳密には、何が GC の root set で、ヒープ上のオブジェクト がどのように辿られるのか、と述べるしかないですが、 経験を元におおざっぱに言いますと… 1.0.X: クラスは回収されない。 1.1.X: ヒープ上のすべてのインスタンス (クラスローダを除く) が そのクラスを必要としない場合。 1.2.X: そのクラスをロードしたクラスローダがゴミにならない限り、 回収されないように変更された。 1.1.X では結構簡単にクラスの unload が起きます。 Class.forName(...) で load して、System.gc() で簡単に unload できます。 (cf. [JavaHouse-Brewers:27855]) かたや 1.2.X では、そう簡単には unload は起きません。 特に、system class loader (bootstrap loader) にロードされたクラスは 絶対に unload されません。 [JavaHouse-Brewers:27853] asynchronous GC thread からのスレッドで、 クラスの回収 (unload) について多少述べられています。 参考になるかと思います。 クラスの unload、ネイティブメソッドからクラスオブジェク トを扱う際は要注意です。気をつけないと、意図せず、いつの 間にかクラスが unload されていて、Segmentation Fault が 起きたりします。(はまった経験あり :) ) これが起こると、原因になかなか気付けません。 このデバッグには java, jre コマンドの -verbosegc オプションが有効です。 > (2)JNIのコーディングテクニックとして、オーバヘッドの大きいJNI関数の > 呼び出し回数を減らすために、クラスのMethodIDのキャッシュ化手法があり > ます。例えば以下のようなコードが考えれられます。 > static jmethodID mid = NULL; > if (mid == NULL) { > jclass clazz = (*env)->GetObjectClass(env,thisObj); > mid = (*env)->GetMethodID(env,clazz,"notify","()V"); > } > そのクラスをGCの対象外にして、メモリ上に確定的に常駐させる方法はありますか? > オブジェクトであれば、JNI関数NewGlobalRef()を使用して参照し続ければ > 良いと思います。 クラスも、java.lang.Class クラスのオブジェクトなので、 普通のオブジェクトと同様に (NewGlobalRef() を使って) global reference として登録してしまえばよいです。 JNI の global references を使わずにクラスの unload を防ぐのは なかなか困難です。かなり苦労しました。 > (3)一般的なJavaVMの実装では、GCが動作している間は、その時にJNIによっ > てNativeコードを実行しているスレッドでさえも、無条件にスケジュールの > 対象から外し、そのスレッドの動作を止めてしまいます。 GC 動作中に他のスレッドを止めることが一般的かどうかは、 世の中に山ほどある JVM を調べなければわかりませんが、 おそらくその通りだと思います。 > そうではなくて、JNIによって実行している処理が、JNI関数ではない場合は > GCの影響を受けずにそのまま動作し、JNI関数を呼び出した時点でGCの影響 > を受ける、JavaVMの実装は実現可能でしょうか? また、そのような実装系は > 実際にありますか? `on the fly GC' を売りものにしている JVM を探せばよいと思います。 とはいえ、JVM 用 GC として最近研究や実装が進められているのは、 on the fly GC (プログラム自体の処理との並行動作) よりむしろ、 動作が排他的でもよいから一回の処理が短時間で済む GC、 のように思います。 generational GC や、リアルタイム処理向けに中断可能な GC など。 GC 専門家に突っ込まれないかびくびくしている首藤 shudoh at muraoka.info.waseda.ac.jp