Middle
Jak jest zorganizowana pamięć w Java?
sobes.tech AI
Odpowiedź od AI
W Javie pamięć jest zarządzana automatycznie przez zbieracz śmieci i dzieli się na kilka obszarów:
-
Heap (Sterta):
- Przechowuje obiekty klas i tablice.
- Jeden dla wszystkich wątków aplikacji.
- Zbieracz śmieci działa na tym obszarze.
- Podzielony na pokolenia (Młode, Stare, Stałe).
-
Stack (Stos):
- Każdy wątek ma własny stos.
- Przechowuje lokalne zmienne typów prymitywnych i odwołania do obiektów na stercie.
- Dane są dodawane i usuwane zgodnie z zasadą LIFO (Last-In, First-Out).
- Automatycznie zwalniany po zakończeniu metody.
-
Method Area (Obszar metod) / PermGen (do Java 8) / Metaspace (od Java 8):
- Przechowuje informacje o załadowanych klasach:
- Metadane klas.
- Bytecode metod.
- Zmienne statyczne.
- Pool stałych.
- Rozmiar PermGen był stały, Metaspace korzysta z pamięci natywnej i może się dynamicznie rozszerzać.
- Przechowuje informacje o załadowanych klasach:
-
Native Method Stacks (Stosy metod natywnych):
- Używany do wywołań metod natywnych (np. C/C++).
- Zwolniony po zakończeniu metody natywnej.
// Przykład użycia pamięci
public class MemoryExample {
private String instanceVariable; // Przechowywana w Heap
public void myMethod(int parameter) { // parameter w Stack
int localVar = 10; // localVar w Stack
String localString = "hello"; // "hello" w String Pool (część Heap/Method Area), odwołanie localString w Stack
Object obj = new Object(); // Object w Heap, odwołanie obj w Stack
Integer wrapper = new Integer(5); // Integer w Heap, odwołanie wrapper w Stack
}
public static void main(String[] args) {
MemoryExample example = new MemoryExample();
example.myMethod(20);
}
}
Obszary pamięci i ich zawartość:
| Obszar | Gdzie się znajduje? | Co przechowuje? | Zarządzanie |
|---|---|---|---|
| Heap | Wspólna dla JVM | Obiekty, tablice | Garbage Collector |
| Stack | Własny dla każdego wątku | Zmienne lokalne prymitywne, odwołania do obiektów | Automatyczne (po zakończeniu metody) |
| Method Area | Wspólna dla JVM | Metadane klas, zmienne statyczne, bytecode, stałe | Garbage Collector (dla klas i statycznych) |
| Native Stacks | Własny dla każdego wątku (przy wywołaniu) | Zmienne i dane metod natywnych | Automatyczne (po zakończeniu metody natywnej) |