IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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í.

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:

Argumenty JVM - Kompilace manuálně v Javě

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í:

Argumenty JVM a Programu - Kompilace manuálně v Javě

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:

Nastavení argumentu v Eclipse - Kompilace manuálně v Javě

 

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 8x (2.65 kB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

Předchozí článek
Java spuštění - Programové argumenty
Všechny články v sekci
Kompilace manuálně v Javě
Článek pro vás napsal Robert Michalovič
Avatar
Uživatelské hodnocení:
4 hlasů
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