ช่องฮีปสามช่องบนโต๊ะมิ้นต์ ช่องกลางสูงและมีแถบสีอำพันเป็นค่าเริ่มต้น

JEP 523: G1 เป็น GC ค่าเริ่มต้นทุกสภาพแวดล้อมใน JDK 27

น้องกายEngineering

คอนเทนเนอร์เล็กหรือเครื่องหน่วยความจำน้อยที่เคยได้ Serial GC โดยอัตโนมัติ จะได้พฤติกรรมใหม่เมื่อไม่ระบุตัวเก็บขยะ

JEP 523 ใน JDK 27 เปลี่ยนกฎว่าถ้าไม่ระบุ GC บนคอมมานด์ไลน์ HotSpot จะ เลือก G1 เสมอ ไม่ว่าจำนวนซีพียูหรือแรมจะเท่าไร ก่อนหน้านี้ตั้งแต่ JDK 9 G1 เป็นค่าเริ่มต้นในเซิร์ฟเวอร์ แต่สภาพแวดล้อมจำกัด (เช่น ซีพียูเดียวหรือแรมต่ำกว่าเกณฑ์เดิม) อาจได้ Serial

G1 หรือ Garbage-First คือตัวเก็บขยะที่บาลานซ์ระหว่าง throughput กับ latency โดยเก็บหน่วยความจำเป็นช่วง ๆ ไม่ต้องพึ่ง full collection บ่อยเท่า Serial ในหลายเคส

ทำไมทีม HotSpot ถึงเปลี่ยน

JEP อธิบายว่า G1 ถูกปรับปรุงจนเทียบเคียง Serial ในหลายเมตริกบนสภาพแวดล้อมจำกัด รวมงานลด synchronization จาก JEP ที่เกี่ยวข้อง และลดการใช้ native memory จึงถือว่าพร้อมแทนที่การเลือก Serial อัตโนมัติ

เป้าหมายสำคัญคือเมื่อไม่ระบุ GC แล้วได้ G1 และในเคสที่เคยได้ Serial ประสิทธิภาพไม่ควรถดถอยอย่างมีนัยสำคัญตามเกณฑ์ทดสอบของทีม

สิ่งที่ยังทำได้เหมือนเดิม

ถ้าระบุ GC เอง เช่น Serial, Parallel หรือ ZGC คำสั่งนั้นยังชนะค่าเริ่มต้น JEP ไม่ได้ลบหรือเลิกใช้ตัวเก็บขยะตัวอื่น

Recap

  • บน JDK 27 ถ้าวาง -Xmx เล็กและไม่ใส่ -XX:+Use...GC ให้ถือว่าได้ G1
  • ถ้า workload เล็กยังต้องการ Serial ให้ใส่แฟล็กชัดเจน
  • วัด throughput, latency, footprint และเวลาสตาร์ทบน RC ก่อนขึ้นจริง
  • อ่าน JEP 523 คู่กับหน้า JDK 27 ก่อนเปลี่ยนอิมในคลัสเตอร์ครับ