Sobes.tech
Middle

Wie ist der Speicher in Java aufgebaut?

sobes.tech KI

Antwort von AI

In Java wird der Speicher automatisch vom Garbage Collector verwaltet und in mehrere Bereiche unterteilt:

  1. Heap (Heap):

    • Speichert Klassenobjekte und Arrays.
    • Eine für alle Threads der Anwendung.
    • Der Garbage Collector arbeitet mit diesem Bereich.
    • Ist in Generationen unterteilt (Jung, Alt, Permanent).
  2. Stack (Stapel):

    • Jeder Thread hat seinen eigenen Stack.
    • Speichert lokale Variablen primitiver Typen und Referenzen auf Objekte im Heap.
    • Daten werden nach dem LIFO-Prinzip (Last-In, First-Out) hinzugefügt und entfernt.
    • Wird beim Abschluss der Methode automatisch freigegeben.
  3. Method Area (Methodenbereich) / PermGen (bis Java 8) / Metaspace (ab Java 8):

    • Speichert Informationen über geladene Klassen:
      • Metadaten der Klassen.
      • Bytecode der Methoden.
      • Statische Variablen.
      • Konstantenpool.
    • Die Größe von PermGen war fest, Metaspace nutzt native Speicher und kann dynamisch erweitert werden.
  4. Native Method Stacks (Stapel der nativen Methoden):

    • Wird für Aufrufe nativer Methoden verwendet (z.B. C/C++).
    • Wird beim Abschluss der nativen Methode freigegeben.
// Beispiel für Speicherverbrauch
public class MemoryExample {

    private String instanceVariable; // Im Heap gespeichert

    public void myMethod(int parameter) { // parameter im Stack

        int localVar = 10; // localVar im Stack

        String localString = "hello"; // "hello" im String Pool (Teil des Heap/Method Area), localString Referenz im Stack

        Object obj = new Object(); // Object im Heap, obj Referenz im Stack

        Integer wrapper = new Integer(5); // Integer im Heap, wrapper Referenz im Stack
    }

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

Speicherbereiche und deren Inhalte:

Bereich Wo befindet er sich? Was speichert er? Verwaltung
Heap Gemeinsamer Bereich für die JVM Objekte, Arrays Garbage Collector
Stack Eigen für jeden Thread Lokale primitive Variablen, Referenzen auf Objekte Automatisch (bei Methodenende)
Method Area Gemeinsamer Bereich für die JVM Metadaten der Klassen, statische Variablen, Bytecode, Konstanten Garbage Collector (für Klassen und Statisches)
Native Stacks Eigen für jeden Thread (bei Aufruf) Variablen und Daten nativer Methoden Automatisch (bei Methodenende)