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í:
-
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).
-
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.
-
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.
- Ukládá informace o načtených třídách:
-
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) |