Sobes.tech
Middle

Jak je v Java paměť uspořádána?

sobes.tech AI

Odpověď od AI

Paměť v Javě je řízena automaticky garbage collectorem a rozdělena do několika oblastí:

  1. Heap (Hromada):

    • Ukládá objekty tříd a pole.
    • Jeden pro všechny vlákna aplikace.
    • Garbage Collector pracuje s touto oblastí.
    • Rozděleno do generací (Young, Old, Permanent).
  2. Stack (Zásobník):

    • Každé vlákno má svůj vlastní zásobník.
    • Ukládá lokální proměnné primitivních typů a odkazy na objekty na hromadě.
    • Data jsou přidávána a odstraňována podle principu LIFO (Last-In, First-Out).
    • Automaticky se uvolňuje při ukončení metody.
  3. Method Area (Oblast metod) / PermGen (před Java 8) / Metaspace (od Java 8):

    • Ukládá informace o načtených třídách:
      • Metadata tříd.
      • Bytecode metod.
      • Statické proměnné.
      • Konstantní pool.
    • Velikost PermGen byla pevná, Metaspace využívá nativní paměť a může se dynamicky rozšiřovat.
  4. Native Method Stacks (Zásobníky nativních metod):

    • Používá se pro volání nativních metod (například C/C++).
    • Uvolňuje se při ukončení nativní metody.
// Příklad použití paměti
public class MemoryExample {

    private String instanceVariable; // Uloženo v Heap

    public void myMethod(int parameter) { // parameter uložen v Stack

        int localVar = 10; // localVar uložen v Stack

        String localString = "hello"; // "hello" v String Poolu (část Heap/Method Area), odkaz localString v Stacku

        Object obj = new Object(); // Object v Heap, odkaz obj v Stacku

        Integer wrapper = new Integer(5); // Integer v Heap, odkaz wrapper v Stacku
    }

    public static void main(String[] args) {
        MemoryExample example = new MemoryExample();
        example.myMethod(20);
    }
}

Oblasti paměti a jejich obsah:

Oblast Kde se nachází? Co ukládá? Správa
Heap Společná pro JVM Objektů, polí Garbage Collector
Stack Vlastní pro každý vlákno Lokální primitivní typy, odkazy na objekty Automatická (při ukončení metody)
Method Area Společná pro JVM Metadata tříd, statické proměnné, bytecode, konstanty Garbage Collector (pro třídy a statiku)
Native Stacks Vlastní pro každé vlákno (při volání) Proměnné a data nativních metod Automatická (při ukončení nativní metody)