Garbage collection & Just-In-Time (JIT) compilation

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

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

Garbage collection - พื้นฐาน

การจัดการหน่วยความจำด้วยตนเอง (C/C++)

  • โปรแกรมเมอร์จัดสรรและคืนหน่วยความจำเอง
  • มีความเสี่ยงเกิด memory leak

$$

Garbage Collection ของ Java

  • จัดสรรหน่วยความจำอัตโนมัติ
  • ตรวจจับออบเจกต์ที่ไม่ได้ใช้งานอัตโนมัติ
  • คืนหน่วยความจำอัตโนมัติ
การปรับแต่งโค้ดใน Java

Garbage collection ทำงานอย่างไร

  • Mark: ระบุออบเจกต์ที่ยังเข้าถึงได้จาก root
  • Sweep: ลบออบเจกต์ที่ไม่สามารถเข้าถึงได้

ภาพหน้าจอแสดงการทำงานของ garbage collection

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

Garbage collection และประสิทธิภาพ

ผลต่อประสิทธิภาพของ GC

  • ช่วยให้พัฒนาได้ง่ายขึ้น แต่มีผลกระทบต่อประสิทธิภาพที่ต้องพิจารณา

$$

อัลกอริทึม GC

  • JVM สมัยใหม่มีอัลกอริทึม garbage collection ให้เลือกหลายแบบ
  • การเลือกขึ้นอยู่กับความต้องการของแอปพลิเคชัน
  • อ่านคู่มือเจาะลึกเกี่ยวกับอัลกอริทึม GC ได้ที่นี่
1 https://www.baeldung.com/jvm-garbage-collectors
การปรับแต่งโค้ดใน Java

ผลกระทบของ GC ต่อประสิทธิภาพ

// Bad - Creating many short-lived objects
for (int i = 0; i < 1000000; i++) {
    new Object(); // Immediately becomes garbage
}


// vs. Reusing objects Object obj; for (int i = 0; i < 1000000; i++) { obj = new Object(); // Only one reference }
การปรับแต่งโค้ดใน Java

การเขียนโค้ดที่เป็นมิตรกับ GC

// Avoid this in performance-critical code
String result = "";
for (int i = 0; i < 100000; i++) {
    result += i; // Creates a new String each time
}


// Better approach StringBuilder builder = new StringBuilder(); for (int i = 0; i < 100000; i++) { builder.append(i); // Reuses the same buffer } String result = builder.toString();
การปรับแต่งโค้ดใน Java

Just-In-Time compilation

  • กระบวนการทำงานของ JVM:
    • Java source -> Bytecode
    • Bytecode -> การรันแบบ interpreted
    • Hot methods -> Native machine code
  • ปรับแต่งโค้ดที่ถูกเรียกใช้บ่อยให้ทำงานเร็วขึ้น
การปรับแต่งโค้ดใน Java

รูปแบบโค้ดที่เป็นมิตรกับ JIT

  • เขียนโค้ดที่คาดเดาได้
// Predictable branches help JIT optimization
if (value > 0) {
    // Code A - frequently taken path
} else {
    // Code B - rarely taken path
}
  • เขียนเมธอดขนาดเล็กที่มุ่งเน้นหน้าที่ชัดเจน
  • เมธอดขนาดเล็กที่ถูกเรียกบ่อยเหมาะสำหรับการ inlining
  • โค้ดที่ซับซ้อนอาจได้รับการปรับแต่งน้อยกว่า
การปรับแต่งโค้ดใน Java

สรุป

  • ลดการสร้างออบเจกต์ในส่วนโค้ดที่ต้องการประสิทธิภาพสูง
  • เขียนโค้ดที่คาดเดาได้และเหมาะกับการปรับแต่งของ JIT
  • ใช้ profiling เพื่อระบุจุดที่ควรปรับแต่งก่อนลงมือแก้ไข
การปรับแต่งโค้ดใน Java

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

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

Preparing Video For Download...