JVM startuje od interpretacji bytecode, a potem JIT kompiluje „gorące” metody do kodu natywnego na podstawie profilowania. Na początku bywa wolniej; po rozgrzaniu działa szybciej dzięki zoptymalizowanemu kodowi maszynowemu.