The Java Virtual Machine (JVM) memory model defines how Java manages memory during program execution. It is divided into several components, each responsible for handling different aspects of memory management.
Key Components of JVM Memory Model:
1. Method Area (Part of Heap)
- Stores class metadata, including:
- Class structure (fields, methods, constructors)
- Static variables
- Constant pool (literals and symbolic references)
- Shared among all threads.
- Garbage collected but not as frequently as the heap.
2. Heap
- The largest memory area.
- Stores all objects and instance variables.
- Managed by the Garbage Collector (GC).
- Shared among all threads.
- Divided into:
- Young Generation (newly created objects)
- Eden Space (new objects allocated)
- Survivor Spaces (S0, S1) (objects that survive minor GC)
- Old Generation (Tenured) (long-lived objects)
- Metaspace (stores class metadata in newer JVM versions)
- Young Generation (newly created objects)
3. Stack (Thread Stack)
- Each thread gets its own stack memory.
- Stores:
- Method call frames
- Local variables
- Intermediate computations
- Grows and shrinks dynamically with method calls.
- Stack Overflow Error occurs if the stack exceeds its limit.
4. PC Register (Program Counter)
- Each thread has its own PC register.
- Stores the address of the currently executing instruction in the JVM bytecode.
- Updated as the program executes.
5. Native Method Stack
- Used for native (non-Java) method execution, e.g., methods written in C/C++.
- Similar to the JVM Stack but for native code.
Interaction with Garbage Collection (GC)
- JVM uses garbage collection to free up memory in the heap.
- Types of Garbage Collection:
- Minor GC: Cleans up the Young Generation (fast and frequent).
- Major (Full) GC: Cleans up the Old Generation (more expensive).
- Metaspace GC: Removes unused class metadata.
Thread-Safety and Synchronization
- The Heap and Method Area are shared, so synchronization mechanisms (like locks) are needed.
- The Stack, PC Register, and Native Method Stack are thread-local, meaning each thread gets its own private memory.
Summary Table
Memory Component | Scope | Stores |
---|---|---|
Method Area | Shared | Class metadata, static variables |
Heap | Shared | Objects, instance variables |
Stack | Per thread | Local variables, method calls |
PC Register | Per thread | Current instruction address |
Native Method Stack | Per thread | Native method execution |