Date: Wed, 29 Sep 99 21:19:47 JST From: SHUDO Kazuyuki Subject: [JavaHouse-Brewers:28157] Re: Exact GC To: java-house-brewers at java-house.etl.go.jp (JavaHouse Brewers ML) Message-Id: <199909291217.VAA05030@cafe.muraoka.info.waseda.ac.jp> 首藤です。 > > ところで、Solaris VMもmixed mode実行をサポートしているというような話 > > を聞いたような気がするのですが、誰か確認できていますか? > > 次のようなオプションが存在するのが証拠だと考えられないでしょうか? > -Xmaxjitcodesize > set the maximum size (in bytes) for the JIT code area IBM や Sun は何をもって mixed mode 実行、 mixed mode interpreter と呼んでいるのでしょう。 (mixed mode interpreter (IBM の JVM) の方は、そのような固有名詞である、 ということかもしれない。) 単に JIT コンパイラが生成したネイティブコードと インタプリタの混合動作、つまり、お互いをメソッド呼び出しできる、 というだけなら、どんな JIT コンパイラでもまずできます。 何かのポリシーをもって *積極的に* JIT コンパイルの対象を絞り込むことを 指して mixed mode … と呼ぶのでしょうか。 JIT コンパイルするかしないかの選択も、単純なものなら ほとんどの JIT コンパイラが行っていると思います。 例えば、クラスの初期化処理 (JVM 内部のメソッド名 `') は、 たいていは JIT コンパイルのメリットがないのでコンパイルしない、など。 インタプリタと JIT コンパイラが生成したコードの混合動作 は、JIT コンパイラのけっこう基本的な機能だと思います。 例えば、次に挙げる局面で、 JIT compiled コードからインタプリタを呼び出すことが必要となります。 - java.lang.Compiler#disable() が呼ばれた後のメソッド呼び出し。 つまり Java プログラムから JIT コンパイルを行わないように 要請されたわけです。その意図を汲むのであれば、 JIT コンパイルを行わずにインタプリタを呼び出すべきです。 Compiler#disable(), enable() は Swing などで使われています。 とはいえ、JIT が disable(), enable() に従ってくれる保証はないです。 例えば TYA はデフォルトでは Compiler#disable(), enable() を無視します。 - メソッド A の JIT コンパイルのためにメソッド A の実行が必要な場合。 メソッド A はまだコンパイル中なのですから インタプリタに実行してもらうしかありません。 これは非常に限られた場合にしか起きないので、 JIT の作り方次第で避けることもできます。 JDK 1.2 では shared library の管理にも Java で書かれたコードが 使われるようになりました。 shared library 中の関数のアドレスを、その Java のコードを使って 解決しようとすると、この状況に陥ります。 SHUDO Kazuyuki/首藤一幸 私をたばねないで あらせいとうの花のように shudoh at muraoka.info.waseda.ac.jp