Java HotSpot VM

Zpracovali: Vašek Mikolášek a Pavel Herout
Vedoucí projektu, korektury, závěrečná revize: Pavel Herout




Úvod -- co to je HotSpot?

Poznámka:
V dalším textu, budou používány pojmy "překladač" a "kompilátor" ve smyslu "JIT (Just In Time) compiler" jako části JVM (Java Virtual Machine). Překladač zde tedy nemá nic společného s programem javac. Toto označení (compiler) pro interpret javy se zcela běžně používá na
java.sun.com.

Java HotSpot VM (Virtual Machine) je JIT kompilátor Javy. HotSpot je součástí Java 2 Standard Edition od verze 1.3.1.

Základní myšlenka HotSpotu je optimalizovat ty části kódu, které si to zaslouží. Program totiž při svém běhu stráví většinu času voláním jen malé části funkcí -- zhruba 20 % z celkového kódu. Není tedy třeba provádět optimalizaci zbylých 80 %, ale můžeme ušetřený výpočetní čas věnovat výkonnější optimalizaci těch částí, které jsou volány nejčastěji. Samozřejmě ale vyvstává otázka, jak tyto části určit.

HotSpot toto řeší tak, že při spuštění programu neprovádí žádné (nebo jen minimální) optimalizace a potom sleduje program a zaznamenává nejčastěji volané metody (tj. "profiling") a ty následně optimalizuje. Důsledkem toho je, že se programy obecně spouští rychleji (vynechaná optimalizace), ale po nějakou "zkušební dobu" běží o něco pomaleji. HotSpot průběžně optimalizuje potřebné funkce a program je tak průběžně zrychlován. HotSpot takto sleduje program od jeho spuštění až do ukončení.

To, kdy je provedena většina optimalizací, záleží na druhu programu (technické výpočty, GUI, textové editory atd.). Pro více informací o prováděných optimalizacích viz dokumentaci na java.sun.com/products/hotspot

Ve skutečnosti v sobě HotSpot zahrnuje dva různé -- nicméně kompatibilní -- překladače, odlišné svou taktikou optimalizace:


Jak spouštět programy s HotSpotem?

Spustíte-li program standardním příkazem java <NazevTridy>, poběží implicitně pod překladačem HotSpot client. To si můžete ověřit jednoduchým příkazem:
java -version
který
vypíše.

Spuštění aplikace pod HotSpot serverem umožní přepínač -server.
Například:

java -server MujProgram
Poznámka:
Tento přepínač (i přepínač -client, který je ovšem zbytečné uvádět) musí být prvními přepínači v příkazové řádce.

Po příkazu:

java -server -version
byste měli dostat výpis.

Zajímavou volbou pro spouštění je (nestandardní a nedokumentovaný ;-) přepínač -Xcomp (kombinovatelný i s -server), který říká interpreteru, aby celý kód přeložil jednorázově do strojového kódu. Zabrání tak HotSpotu provádět optimalizaci za běhu, ovšem za cenu, že spouštění trvá déle a samozřejmě program není dobře optimalizován.
Zkuste příkaz:

java -Xcomp -version
Výsledek si můžete prohlédnout zde.

Poznámka:
Pokud se rozhodnete, že budete chtít spouštět vaše programy implicitně pod HotSpot serverem, lze toto podle informací z HotSpot FAQ nastavit v souboru jvm.cfg, který se nalézá v podadresáři jre\lib v adresáři, kde máte nainstalovanou J2SE. Na první nezakomentované řádce má být -server. (Tuto skutečnost se ale nepodařilo ověřit.)


Výsledky rychlostních testů

Pro výsledky porovnání HotSpotu s jinými (konkurenčními) překladači odkazuji na
oficiální zdroj. Tato část se zabývá porovnáním HotSpot client a HotSpot server.

Jak již bylo zmíněno dříve, HotSpot server (zkráceně server) je určen především pro aplikace určené k dlouhodobějšímu běhu, u kterých je žádoucí větší výkon. Oproti tomu client je určen pro aplikace s GUI, od kterých se očekává, že se hlavně rychle spustí, aby se uživatel zbytečně neznervózňoval prodleními při načítání programu.

Těmto tvrzením dobře odpovídají i výsledky provedených testů.

Poznámky: