5. diel - Java spustenie - JVM argumenty
V predchádzajúcom lekcii, Java spustenie - Programové argumenty , sme si predviedli spustenie s programovými argumenty.
Dnes bude reč o JVM parametroch, ktorými sa pri spustení konfiguruje priamo virtuálny stroj Javy. Tieto parametre rozhodne ako začiatočníci nepoužívajte. Hodiť sa vám budú ešte len až budete vedieť, čo vlastne s JVM robíte. Na druhú stranu sa to zas nenaučíte, keď to nevyskúšate či neotestujete.
JVM argumenty
Čo to sú JVM argumenty (parametre)? Odpoveď vezmeme trochu zoširoka. Ako vieme, JVM (Java Virtual Machine) je program, ktorý nám umožňuje spúšťať Java programy. Parametre JVM sú parametre, ktoré môžeme zadať pred spustením JVM. Nedajú sa modifikovať počas už spusteného JVM. Parametre nám umožňujú ovplyvňovať beh JVM a definovať ju napr. Maximálne množstvo pamäte a ďalšie správanie, ktoré je predprogramované vývojári JVM.
Zaiste ste si všimli, že každý program si spustí svoju vlastnú JVM. To znamená, že nám ich môže na našom OS súčasne bežať viac as rôznymi parametrami. Parametre JVM sa samozrejme vyvíja rovnako ako Java. Niektoré sú zastarané (obsolete), iné boli zrušené a niektoré zas pridané (napr. Porovnajte si rozdiel medzi Java06 a Java14, na ktoré sme si už do dokumentácie odkazovali).
Typy argumentov
Ak si pozrieme dokumentáciu verzií spúšťačov Java, napr. Verzie 14, uvidíme, že JVM argumenty sú rozdelené do niekoľkých sekcií:
- Standard Options for Java - Voľby garantované a
podporované všetkými implementáciami JVM, napr. Nastavenie modulov (Java9 a
vyššie), testovanie verzia JVM, nastavenie
classpath
, pomocné výstupy, systémové premenné JVM atď. - Extra Options for Java - Začínajú
-X
a nemusia byť podporované všetkými implementáciami JVM, prípadne sa môžu meniť.
Ďalej tu máme pokročilé možnosti, ktoré pre bežné použitie
neodporúčam. Sú to možnosti pre vývojárov používané pre vyladenie
špecifických oblastí behu JVM. Začínajú -XX
:
- Advanced Runtime Options for Java - Riadi behové správanie JVM.
- Advanced JIT Compiler Options for Java - Umožňuje pokročilé nastavenie kompilátora.
- Advanced Serviceability Options for Java - Zhromažďuje systémové informácie a vykonáva rozsiahle ladenie.
- Advanced Garbage Collection Options for Java - Umožňuje nastaviť správanie garbage collector (pravidlá pre čistenie haldy).
Následne sú tu možnosti starších nastavenia:
- Deprecated Java Options - Funkčné, ale neodporúčané, takže sa vykonajú s Warning
- Obsolete Java Options - Funkčné, ale ignorované, nevykonajú sa, vyvolajú warning
- Removed Java Options - Odstránené, nevykonajú sa a spôsobí Error
Ak si preštudujete zverejnený zoznam argumentov JVM, potom vidíte, že je ich celkom dosť. Niektoré sú k ničomu, niektoré niekedy môžu pomôcť a niektoré sú nevyhnutné (napr. Moduly od Java09). Samozrejme parametrov JVM (options) môžeme nastaviť aj viac ako len jeden. A ďalej dôležitá pripomienka, tieto parametre možno použiť len pri spustení z príkazového riadku / skriptu.
Príklady
Tu si uvedieme nejaké bežné príklady.
Maximálnu veľkosť haldy
Predpokladajme, že máme aplikáciu, ktorá padá na chybu
java.lang.OutOfMemoryError
. Pokiaľ nie je chyba v našom algoritme
a aplikácie oprávnene vyžaduje kvantá pamäte a nemožno ju vylepšiť tak,
aby tomu tak nebolo, môžeme limit pamäti JVM zvýšiť.
Ukážme si ako nastaviť maximálnu veľkosť haldy v JVM na 1.2 GB s
parametrom -Xmx
:
java -Xmx1200M -jar Program.jar
Toto nastavenie naozaj dáva zmysel len keď viete, čo robíte.
Predvolenú veľkosť haldy
Skúsme nastaviť predvolenú veľkosť haldy na 512 MB s parametrom
-Xms
:
java -Xms512M -jar Program.jar
Spustenie JavaFX projektu
Ak chceme spustiť JavaFX projekt s parametrami --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 parametre JVM
Teraz si predvedieme jednoduchý program, kde využijeme parametre JVM.
Program bude v súbore ArgumentyJVM.java
a jeho kód bude
nasledujúce:
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äť som sa snažil o pokiaľ možno jednoduchý príklad. V prvej časti si vyrobíme objekt runtime prostredie (zástupný objekt JVM) a pokúsime sa z neho získať nejaké informácie. Za výpisom hodnôt z JVM si vyskúšame aj využitia premenné JVM. Program potom skompilujeme:
javac ArgumentyJVM.java
a kód si spustíme napr. príkazom:
java -Xmx1000M -Xms700M -DjvmPromenna=hodnotaXX -cp . ArgumentyJVM
Xmx
(maximálna veľkosť haldy) sme nastavili na hodnotu
1000M
(1 gigabyte) a Xms
(predvolená veľkosť haldy)
na 700M
(0.7 gigabyte). Len pripomínam, že Xmx
musí
byť väčšia ako Xms
, inak vám spustenie programu spadne, ako je
vidieť na mojom poslednom vykonanom príkazu:
Kombinácia JVM a argumentov programu
Argumenty JVM a argumenty programu možno samozrejme používať oboje v jednom programe. Kód takéhoto programu by vyzeral napr. Takto (jedná sa o kombináciu dvoch našich vzorových programov):
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 by sme po kompiláciu spustili napr. Príkazom:
java -Xmx1000M -Xms700M -DjvmPromenna=hodnotaXX -cp . ArgumentyJVMProg -x info -y test -help informace
A výsledok by bol nasledujúci:
Využívanie JVM a programových parametrov nie je doménou len príkazového riadku. Možno to samozrejme nastavovať aj v IDE, viď. obrázok nastavenia v Eclipse nižšie:
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 9x (2.65 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java