Sobes.tech
Middle

Kaip yra suorganizuota Java atmintis?

sobes.tech AI

Atsakymas iš AI

Java atmintis yra automatiškai valdomas šiukšlių surinkėjo ir padalinta į keletą sričių:

  1. Heap (Kaušas):

    • Saugo klasių objektus ir masyvus.
    • Vienas visoms programos srautų.
    • Šiukšlių surinkėjas veikia su šia sritimi.
    • Padalinta į kartas (Young, Old, Permanent).
  2. Stack (Kaušelis):

    • Kiekvienas srautas turi savo kaušelį.
    • Saugo vietines primitivių tipų kintamąsias ir nuorodas į objektus kaušelyje.
    • Duomenys pridedami ir pašalinami pagal LIFO (Last-In, First-Out) principą.
    • Automatiškai atlaisvinama metodo pabaigoje.
  3. Method Area (Metodų sritis) / PermGen (iki Java 8) / Metaspace (nuo Java 8):

    • Saugo įkeltų klasių informaciją:
      • Klasių metaduomenys.
      • Baitkodo metodams.
      • Statinius kintamuosius.
      • Konstantišką pool'ą.
    • PermGen dydis buvo fiksuotas, Metaspace naudoja nativų atmintį ir gali dinamiškai plėstis.
  4. Native Method Stacks (Natyviosios metodų steko):

    • Naudojamas nativų metodų iškvietimams (pvz., C/C++).
    • Atlaisvinama metodo pabaigoje.
// Atminties naudojimo pavyzdys
public class MemoryExample {

    private String instanceVariable; // Saugojamas Heap'e

    public void myMethod(int parameter) { // parameter saugomas Stack'e

        int localVar = 10; // localVar saugomas Stack'e

        String localString = "hello"; // "hello" String Pool'e (dalys Heap/Method Area), localString nuoroda Stack'e

        Object obj = new Object(); // Object Heap'e, obj nuoroda Stack'e

        Integer wrapper = new Integer(5); // Integer Heap'e, wrapper nuoroda Stack'e
    }

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

Atminties sričių ir jų turinio lentelė:

Sritis Kur randasi? Ką saugo? Valdymas
Heap Bendra JVM dalis Objektai, masyvai Garbage Collector
Stack Kiekvieno srauto atskiras Vietinės primityvios rūšys, nuorodos į objektus Automatinis (metodo pabaigoje)
Method Area Bendra JVM dalis Klasės metaduomenys, statiniai kintamieji, baitkodas, konstantos Garbage Collector (klasėms ir statiniams)
Native Stacks Kiekvieno srauto atskiras (kvietimo metu) Natyviosios metodų kintamieji ir duomenys Automatinis (natyviosios metodo pabaigoje)