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:
-
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).
-
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.
-
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.
- Speichert Informationen über geladene Klassen:
-
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) |