JVM (Java Virtual Machine) จัดสรรหน่วยความจำ 5 พื้นที่หลัก (Runtime Data Areas) ตาม JVM Spec
5 พื้นที่หน่วยความจำ (Memory Areas)
| Area | คำอธิบาย | Scope | Thread Safety |
|---|---|---|---|
| 1. Heap | เก็บ Object Instances, Arrays (Reference Types) - Shared ทุก Thread | Global | Shared (ต้อง GC) |
| 2. Stack (Java Stack) | เก็บ Local Variables, Method Call Frames, Partial Results - Per Thread | Per Thread | Thread-Local |
| 3. PC Registers (Program Counter) | เก็บ Address ของ Instruction ที่ Thread กำลัง Execute - Per Thread | Per Thread | Thread-Local |
| 4. Method Area (Metaspace/Java 8+) | เก็บ Class Metadata, Static Variables, Constant Pool, Method Code - Shared | Global | Shared |
| 5. Native Method Stack | เก็บ Stack สำหรับ Native Methods (JNI, C/C++) - Per Thread | Per Thread | Thread-Local |
รายละเอียดเพิ่มเติม
Heap
- สร้างตอน JVM Start, ทุก Thread แชร์
- Managed by Garbage Collector (GC)
- ตั้งค่า:
-Xms(Initial),-Xmx(Max)
Stack
- แต่ละ Thread มี Stack ของตัวเอง
- Frame = Method Invocation (Local Vars, Operand Stack, Return Address)
- Method Return -> Pop Frame
- ตั้งค่า:
-Xss(Stack Size ต่อ Thread) - Error:
StackOverflowError(Recursion ลึกเกิน),OutOfMemoryError(Thread เยอะเกิน)
PC Registers
- Pointer ไปยัง Bytecode Instruction ปัจจุบัน
- Native Method ไม่ใช้ PC Register
Method Area (Metaspace)
- Java 7: PermGen (Fixed Size) -> Java 8+: Metaspace (Native Memory, Auto-resize)
- เก็บ Class Definitions, Static Fields, Constants, Annotations
- ตั้งค่า:
-XX:MetaspaceSize,-XX:MaxMetaspaceSize
Native Method Stack
- สำหรับ JNI Calls (Java Native Interface)
- C/C++ Code เรียกผ่าน JNI ใช้ Stack นี้
ภาพรวม
+-------------------------+ | JVM Process | | +-------------------+ | | | Heap | | <- Shared (Objects, GC) | +-------------------+ | | | Method Area | | <- Shared (Class Metadata, Static) | | (Metaspace) | | | +-------------------+ | | | Thread 1 Stack | | <- Per Thread | | Thread 1 PC Reg | | | | Thread 1 Native | | | +-------------------+ | | | Thread 2 Stack | | <- Per Thread | | Thread 2 PC Reg | | | | Thread 2 Native | | | +-------------------+ | +-------------------------+
สรุป
JVM มี 5 Memory Areas: Heap (Shared Objects), Stack (Per Thread Frames), PC Registers (Per Thread Instruction Pointer), Method Area/Metaspace (Shared Class Metadata), Native Method Stack (Per Thread JNI)