Lekce 5 - Java spuštění - JVM argumenty
V předchozím lekci, Java spuštění - Programové argumenty, jsme si předvedli spuštění s programovými argumenty.
Dnes bude řeč o JVM parametrech, kterými se při spuštění konfiguruje přímo virtuální stroj Javy. Tyto parametry rozhodně jako začátečníci nepoužívejte. Hodit se vám budou teprve až budete vědět, co vlastně s JVM děláte. Na druhou stranu se to zas nenaučíte, když to nevyzkoušíte či neotestujete.
JVM argumenty
Co to jsou JVM argumenty (parametry)? Odpověď vezmeme trochu zeširoka. Jak víme, JVM (Java Virtual Machine) je program, který nám umožňuje spouštět Java programy. Parametry JVM jsou parametry, které můžeme zadat před spuštěním JVM. Nedají se modifikovat během již spuštěného JVM. Parametry nám umožňují ovlivňovat běh JVM a definovat ji např. maximální množství paměti a další chování, které je předprogramované vývojáři JVM.
Zajisté jste si všimli, že každý program si spustí svou vlastní JVM. To znamená, že nám jich může na našem OS současně běžet více a s různými parametry. Parametry JVM se samozřejmě vyvíjí stejně jako Java. Některé jsou zastaralé (obsolete), jiné byly zrušeny a některé zas přidány (např. porovnejte si rozdíl mezi Java06 a Java14, na které jsme si již do dokumentace odkazovali).
Typy argumentů
Pokud si prohlédneme dokumentaci verzí spouštěčů Java, např. verze 14, uvidíme, že JVM argumenty jsou rozděleny do několika sekcí:
- Standard Options for Java - Volby garantované a
podporované všemi implementacemi JVM, např. nastavení modulů (Java9 a
výše), testování verze JVM, nastavení
classpath
, pomocné výstupy, systémové proměnné JVM atd. - Extra Options for Java - Začínají
-X
a nemusí být podporované všemi implementacemi JVM, případně se mohou měnit.
Dále zde máme pokročilé možnosti, které pro běžné použití
nedoporučuji. Jsou to možnosti pro vývojáře používané pro vyladění
specifických oblastí běhu JVM. Začínají -XX
:
- Advanced Runtime Options for Java - Řídí běhové chování JVM.
- Advanced JIT Compiler Options for Java - Umožňuje pokročilé nastavení kompilátoru.
- Advanced Serviceability Options for Java - Shromažďuje systémové informace a provádí rozsáhlé ladění.
- Advanced Garbage Collection Options for Java - Umožňuje nastavit chování garbage collectoru (pravidla pro čištění haldy).
Následně jsou zde možnosti starších nastavení:
- Deprecated Java Options - Funkční, ale nedoporučované, takže se provedou s warningem
- Obsolete Java Options - Funkční, ale ignorované, neprovedou se, vyvolají warning
- Removed Java Options - Odstraněné, neprovedou se a způsobí Error
Pokud si prostudujete zveřejněný seznam argumentů JVM, pak vidíte, že je jich docela dost. Některé jsou k ničemu, některé někdy mohou pomoci a některé jsou nevyhnutelné (např. moduly od Java09). Samozřejmě parametrů JVM (options) můžeme nastavit i více než jen jeden. A dále důležitá připomínka, tyto parametry lze použít pouze při spuštění z příkazové řádky/skriptu.
Příklady
Zde si uvedeme nějaké běžné příklady.
Maximální velikost haldy
Předpokládejme, že máme aplikaci, která padá na chybu
java.lang.OutOfMemoryError
. Pokud není chyba v našem algoritmu a
aplikace oprávněně vyžaduje kvanta paměti a nelze ji vylepšit tak, aby
tomu tak nebylo, můžeme limit paměti JVM zvýšit.
Ukažme si jak nastavit maximální velikost haldy v JVM na 1.2 GB s
parametrem -Xmx
:
java -Xmx1200M -jar Program.jar
Toto nastavení opravdu dává smysl jen když víte, co děláte.
Výchozí velikost haldy
Zkusme nastavit výchozí velikost haldy na 512 MB s parametrem
-Xms
:
java -Xms512M -jar Program.jar
Spuštění JavaFX projektu
Pokud chceme spustit JavaFX projekt s parametry --module-path
a
--add-modules
, napíšeme:
java --module-path "D:\JavaFX11\lib" --add-modules=javafx.controls,javafx.base,javafx.fxml -jar SpustFX11.jar
Testovací program na parametry JVM
Nyní si předvedeme jednoduchý program, kde využijeme parametry JVM.
Program bude v souboru ArgumentyJVM.java
a jeho kód bude
následující:
import java.io.*; public class ArgumentyJVM { public static void main (String [] args) throws java.io.IOException { System.out.println("Start Programu"); Runtime sys = Runtime.getRuntime(); System.out.println("Cela pamet urcena pro JVM :\t\t" + sys.totalMemory() + " Bytes"); System.out.println("Dostupna pamet pro JVM :\t\t" + sys.maxMemory() + " Bytes"); System.out.println("Volna pamet v JVM pred alokaci :\t" + sys.freeMemory() + " Bytes"); System.out.println("Hodnota JVM promenne : " + System.getProperty("jvmPromenna")); System.out.println("Konec Programu"); } }
Opět jsem se snažil o pokud možno jednoduchý příklad. V první části si vyrobíme objekt běhového prostředí (zástupný objekt JVM) a pokusíme se z něj získat nějaké informace. Za výpisem hodnot z JVM si vyzkoušíme i využití proměnné JVM. Program poté zkompilujeme:
javac ArgumentyJVM.java
a kód si spustíme např. příkazem:
java -Xmx1000M -Xms700M -DjvmPromenna=hodnotaXX -cp . ArgumentyJVM
Xmx
(maximální velikost haldy) jsme nastavili na hodnotu
1000M
(1 gigabyte) a Xms
(výchozí velikost haldy) na
700M
(0.7 gigabyte). Jen připomínám, že Xmx
musí
být větší než Xms
, jinak vám spuštění programu spadne, jak
je vidět na mém posledním provedeném příkazu:
Kombinace JVM a argumentů programu
Argumenty JVM a argumenty programu lze samozřejmě používat oboje v jednom programu. Kód takového programu by vypadal např. takto (jedná se o kombinaci dvou našich ukázkových programů):
import java.io.*; public class ArgumentyJVMProg { public static void main (String [] args) throws java.io.IOException { System.out.println("Start Programu"); System.out.println("Pocet argumentu :"+args.length); for (String arg : args) { System.out.println("\t" + arg); } System.out.println("Argument 1 : " + args[0]); System.out.println("Argument 3 : " + args[2]); System.out.println("Argument 5 : " + args[4]); System.out.println("Argument 6 : " + args[5]); Runtime sys = Runtime.getRuntime(); System.out.println("Cela pamet urcena pro JVM :\t\t" + sys.totalMemory() + " Bytes"); System.out.println("Dostupna pamet pro JVM :\t\t" + sys.maxMemory() + " Bytes"); System.out.println("Volna pamet v JVM pred alokaci :\t" + sys.freeMemory() + " Bytes"); System.out.println("Hodnota JVM promenne : " + System.getProperty("jvmPromenna")); System.out.println("Konec Programu"); } }
Kód bychom po kompilaci spustili např. příkazem:
java -Xmx1000M -Xms700M -DjvmPromenna=hodnotaXX -cp . ArgumentyJVMProg -x info -y test -help informace
A výsledek by byl následující:
Využívání JVM a programových parametrů není doménou jen příkazového řádku. Lze to samozřejmě nastavovat i v IDE, viz. obrázek nastavení v Eclipse níže:
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 9x (2.65 kB)
Aplikace je včetně zdrojových kódů v jazyce Java