Middle
Hoe is het geheugen in Java opgebouwd?
sobes.tech AI
Antwoord van AI
In Java wordt het geheugen automatisch beheerd door de garbage collector en verdeeld in verschillende gebieden:
-
Heap (Heap):
- Slaat klasse-objecten en arrays op.
- Eén voor alle threads van de toepassing.
- De garbage collector werkt met dit gebied.
- Opgedeeld in generaties (Jong, Oud, Permanent).
-
Stack (Stapel):
- Elke thread heeft zijn eigen stack.
- Slaat lokale variabelen van primitieve types en referenties naar objecten in de heap op.
- Gegevens worden toegevoegd en verwijderd volgens het LIFO-principe (Last-In, First-Out).
- Wordt automatisch vrijgegeven bij het beëindigen van de methode.
-
Method Area (Methodengebied) / PermGen (tot Java 8) / Metaspace (vanaf Java 8):
- Slaat informatie op over geladen klassen:
- Metadata van klassen.
- Bytecode van methoden.
- Statische variabelen.
- Constant pool.
- De grootte van PermGen was vast, Metaspace gebruikt native geheugen en kan dynamisch worden uitgebreid.
- Slaat informatie op over geladen klassen:
-
Native Method Stacks (Stakken van native methoden):
- Wordt gebruikt voor aanroepen van native methoden (bijvoorbeeld C/C++).
- Wordt vrijgegeven bij het beëindigen van de native methode.
// Voorbeeld van geheugengebruik
public class MemoryExample {
private String instanceVariable; // Opgeslagen in Heap
public void myMethod(int parameter) { // parameter in Stack
int localVar = 10; // localVar in Stack
String localString = "hello"; // "hello" in String Pool (deel van Heap/Method Area), referentie localString in Stack
Object obj = new Object(); // Object in Heap, referentie obj in Stack
Integer wrapper = new Integer(5); // Integer in Heap, referentie wrapper in Stack
}
public static void main(String[] args) {
MemoryExample example = new MemoryExample();
example.myMethod(20);
}
}
Geheugengebieden en hun inhoud:
| Gebied | Waar bevindt het zich? | Wat slaat het op? | Beheer |
|---|---|---|---|
| Heap | Gedeeld voor de JVM | Objecten, arrays | Garbage collector |
| Stack | Eigen voor elke thread | Lokale primitieve variabelen, referenties naar objecten | Automatisch (bij method einde) |
| Method Area | Gedeeld voor de JVM | Metagegevens van klassen, statische variabelen, bytecode, constanten | Garbage collector (voor klassen en statisch) |
| Native Stacks | Eigen voor elke thread (bij aanroep) | Variabelen en gegevens van native methoden | Automatisch (bij method einde) |