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ų:
-
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).
-
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.
-
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.
- Saugo įkeltų klasių informaciją:
-
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) |