ทำความเข้าใจสถาปัตยกรรมหน่วยความจำของ JVM

การปรับแต่งโค้ดใน Java

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

JVM คืออะไร?

  • สภาพแวดล้อมการรันที่เป็นอิสระจากแพลตฟอร์ม
  • แปลง bytecode (.class) เป็น machine code
  • จัดการหน่วยความจำและ garbage collection
  • การคอมไพล์แบบ Just-In-Time
การปรับแต่งโค้ดใน Java

ภาพรวมสถาปัตยกรรมหน่วยความจำของ JVM

สถาปัตยกรรมหน่วยความจำของ JVM

การปรับแต่งโค้ดใน Java

Stack memory

  • พื้นที่หน่วยความจำสำหรับการรันเมธอดและตัวแปรโลคัล
  • โครงสร้างแบบ LIFO (Last-In-First-Out)
  • เก็บข้อมูล:
    • ตัวแปรโลคัล
    • ชนิดข้อมูลพื้นฐาน (Primitive)
    • ข้อมูลการเรียกใช้เมธอด
  • เกิด StackOverflowError หากใช้เกินขนาด
การปรับแต่งโค้ดใน Java

Heap memory

  • เก็บออบเจ็กต์และอาร์เรย์ทั้งหมด
  • new สร้างออบเจ็กต์และจัดสรรหน่วยความจำใน heap
  • จัดการโดย garbage collector
  • ขนาดปรับได้แบบไดนามิก
  • แบ่งออกเป็นหลาย generation
การปรับแต่งโค้ดใน Java

หน่วยความจำในการทำงานจริง

public void processData() {
    int count = 0;                  // Stack

String name = "Java"; // Heap
List<String> items = // Reference on Stack new ArrayList<>(); // Object on Heap
items.add(new String("Item")); // Object on Heap }
การปรับแต่งโค้ดใน Java

รูปแบบการเขียนโค้ดที่ใช้หน่วยความจำอย่างมีประสิทธิภาพ

// Inefficient
List<String> list1 = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
    String s = new String("value"); // 1000 objects
    list1.add(s);
}

// Better
List<String> list2 = new ArrayList<>();
String s = "value";  // Single object
for (int i = 0; i < 1000; i++) {
    list2.add(s);
}
การปรับแต่งโค้ดใน Java

สรุป

  • JVM จัดการหน่วยความจำผ่านพื้นที่หลัก ได้แก่ stack และ heap
  • Stack memory -> รวดเร็ว เก็บชนิดข้อมูลพื้นฐานและ reference
  • Heap memory -> เก็บออบเจ็กต์
การปรับแต่งโค้ดใน Java

มาฝึกกันเถอะ!

การปรับแต่งโค้ดใน Java

Preparing Video For Download...