Sobes.tech
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:

  1. 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).
  2. 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.
  3. 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.
  4. 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)