Middle
Cum este structurată memoria în Java?
sobes.tech AI
Răspuns de la AI
În Java, memoria este gestionată automat de colectorul de gunoi și este împărțită în mai multe zone:
-
Heap (Heap):
- Stochează obiecte de clasă și array-uri.
- Una pentru toate firele de execuție ale aplicației.
- Colectorul de gunoi lucrează cu această zonă.
- Este împărțită în generații (Tânăr, Vechi, Permanent).
-
Stack (Stivă):
- Fiecare fir de execuție are propria stivă.
- Stochează variabile locale de tipuri primitive și referințe la obiecte în heap.
- Datele sunt adăugate și eliminate conform principiului LIFO (Last-In, First-Out).
- Este eliberată automat la finalizarea metodei.
-
Method Area (Zona de metode) / PermGen (până la Java 8) / Metaspace (începând cu Java 8):
- Stochează informații despre clasele încărcate:
- Metadate ale claselor.
- Bytecode-ul metodelor.
- Variabile statice.
- Pool-ul de constante.
- Dimensiunea PermGen era fixă, Metaspace folosește memoria nativă și poate fi extins dinamic.
- Stochează informații despre clasele încărcate:
-
Native Method Stacks (Stivele metodelor native):
- Folosit pentru apeluri la metode native (de exemplu, C/C++).
- Este eliberată la finalizarea metodei native.
// Exemplu de utilizare a memoriei
public class MemoryExample {
private String instanceVariable; // Stocată în Heap
public void myMethod(int parameter) { // parameter în Stack
int localVar = 10; // localVar în Stack
String localString = "hello"; // "hello" în String Pool (parte din Heap/Method Area), referința localString în Stack
Object obj = new Object(); // Object în Heap, referința obj în Stack
Integer wrapper = new Integer(5); // Integer în Heap, referința wrapper în Stack
}
public static void main(String[] args) {
MemoryExample example = new MemoryExample();
example.myMethod(20);
}
}
Zonele de memorie și conținutul lor:
| Zonă | Unde se află? | Ce stochează? | Gestionare |
|---|---|---|---|
| Heap | Partajat pentru JVM | Obiecte, array-uri | Colector de gunoi |
| Stack | Proprietar pentru fiecare thread | Variabile locale primitive, referințe la obiecte | Automat (la finalul metodei) |
| Method Area | Partajat pentru JVM | Metadate ale claselor, variabile statice, bytecode, constante | Colector de gunoi (pentru clase și statice) |
| Native Stacks | Proprietar pentru fiecare thread (la apel) | Variabile și date ale metodelor native | Automat (la finalul metodei native) |