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

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