Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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:

argumenty JVM - Java - Pre pokročilých

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:

Argumenty JVM a Programu - Java - Pre pokročilých

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:

Nastavenie argumentu v Eclipse - Java - Pre pokročilých

 

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é 8x (2.65 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Predchádzajúci článok
Java spustenie - Programové argumenty
Všetky články v sekcii
Java - Pre pokročilých
Článok pre vás napísal Robert Michalovič
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Programuji převážně v Javě SE,EE a trochu nativním C a CUDA. více viz.https://cz.linkedin.com/in/robert-michalovic
Aktivity