Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

JVM จัดสรรพื้นที่หน่วยความจำกี่ประเภทใน Java?

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)