V této kapitole si řekneme něco o tom, jak funguje javovský
virtuální stroj
(angl. Java Virtual Machine, JVM).
JVM umožňuje
spouštět javovské programy. Úkolem JVM je poskytovat programům vždy
stejné prostředí. Stejné prostředí zajistí, že javovský program běží
na počítači s procesorem SPARC a operačním systémem Solaris stejně
jako na počítači s procesorem Intel a operačním systémem MS Windows.
Spuštění javovského programu probíhá ve dvou krocích: v prvním kroku
spustíme JVM a ve druhém kroku JVM nahraje do paměti bajtkód a
spustí jej (zavolá metodu main).
Podívejme se na to, jak vypadá
program běžící v JVM. Paměť programu je rozdělena na tři oblasti:
zásobník
(angl. stack),
halda
(angl. heap) a
oblast metod
(angl. method area).
Oblast metod obsahuje program (bajtkód).
Program je tvořen posloupností instrukcí JVM. Každá instrukce se
skládá z jednobajtového operačního znaku a případně operandů.
Např. instrukce goto
má operační znak 167 a provede nepodmíněný
skok na adresu určenou operandem.
Zásobník slouží pro alokaci lokálních proměnných, pro ukládání
parametrů a výsledků instrukcí JVM a pro předávání parametrů a
výsledků při volání metod. Paměť zásobníku se přiděluje po tzv.
rámcích (angl. stack frames).
Každé volání metody alokuje nový rámec. Rámec obsahuje paměť pro
lokální proměnné a tzv. zásobník operandů
(angl. operand stack).
JVM udržuje ukazatel na tzv. vrchol zásobníku, což je naposledy
vložená hodnota. Zásobník operandů se používá pro parametry a
výsledky instrukcí JVM.
Např. instrukce
iadd vyzvedne dvě hodnoty
z vrcholu zásobníku, tyto hodnoty sečte a výsledek umístí na
vrchol zásobníku.
Každá položka operandového zásobníku má délku nejméně 4 bajty.
Všechny aritmetické instrukce JVM tedy pracují s operandy délky
nejméně 32 bitů. V oblasti proměnných se paměť přiděluje také
po 4 bajtech. To znamená, že každá proměnná zabírá v JVM
nejméně 32 bitů.
Halda je oblast paměti, v níž můžeme za běhu programu vytvářet
objekty. Vytváření objektů na haldě se provádí pomocí klíčového
slova new. Na rozdíl např. od jazyka
C++ není potřeba objekty odstraňovat (tzv. dealokovat).
O odstraňování objektů se v Javě stará
tzv. garbage collector.
Garbage collector sám rozpozná nepoužívané objekty a tyto objekty
dealokuje. Po dealokaci objektu je paměť, kterou objekt zabíral,
připravena k dalšímu použití.