JVM работает с JIT (Just-In-Time) компилятором: он компилирует байт-код Java в машинный код на лету. Он делает много сложного анализа, чтобы определить, когда и что компилировать в нативный код. Одна из вещей, на которую он смотрит, - это код, который запускается более одного раза - если вы выполняете какой-то фрагмент кода 10.000 раз, как вы это делаете, JVM, скорее всего, решит, что выгодно скомпилировать его в нативный код, а затем запустить что каждый раз, когда код выполняется снова.
Насколько я знаю, вы не можете контролировать, когда JVM делает это. ( edit : может быть не так, как указывает mdma в своем ответе - есть несколько расширенных опций -XX
).
У Sun есть две версии JVM: клиентская JVM, которая настроена для быстрого запуска, но менее агрессивной оптимизации, и серверная JVM, которая имеет более медленное время запуска, но которая выполняет более агрессивные оптимизации.
Вы можете попробовать запустить вашу программу с сервером JVM:
java -server com.mypackage.MyProgram
Обратите внимание, что, насколько мне известно, только 64-разрядная версия Sun Java для Windows включает сервер JVM.