first-published: Apr 30 14:15, 2000
last-modified: Aug 29 17:00, 2000
初めて呼び出された瞬間にコンパイルしてもいいのですが、コ ンパイルしたメソッドがその一回限りしか呼び出されずに結局 損をしてしまうことがままあります。そこで、何回か呼び出さ れた時点ではじめてそのメソッドをコンパイルする、というこ とがよく行われます。このようにコンパイルのタイミングを遅 らせることを Lazy Compilation と呼びます。これは、実行時情報を活用 したコンパイル一般を指す Adaptive Compilation (適応的コンパイル) の一種です。Lazy Compilation は、これまで何回も呼ばれてきたメソッドは今後 も何回も呼ばれるだろうから、コンパイルしておけば得をする に違いない、という経験則に基づいています。
しきい値の設定をいろいろと変えてみて、下記のごく簡単なアプレットを実行した際に
public class HelloWorld extends Applet { public void init() { resize(150, 30); } public void paint(Graphics g) { g.drawString("Hello world.", 50, 25); System.exit(0); } }
Sun の HotSpot VM では、メソッド呼び出し時だけでなく後方 ジャンプ時にもメソッド呼び出しカウンタを増やします。しき い値を越えた場合はメソッド実行中であっても JITコンパイル を行い、メソッドの途中からネイティブコードの実行に切替え ることも可能となっています。これにより、インタプリタで実 行を始めたのだけれど実は繰り返し回数の多いループがあって… コンパイルしておけばよかった!という場合にも対応できるよ うになっています。逆に、JITコンパイラが生成したネイティ ブコードの実行中であってもインタプリタによる実行に切替え ることもできます (on stack replacement)。これにより、ま さにネイティブコードが実行されている最中のメソッドを再コ ンパイルすることも可能となっています。最適化のし直しに有 効です。