อัลกอริทึม GC: Serial, G1, ZGC, Shenandoah
เปรียบเทียบลักษณะการหยุดชั่วคราวของ GC และข้อแลกเปลี่ยนด้านปริมาณงานระหว่างตัวเก็บขยะสมัยใหม่ของ JVM
อัลกอริทึม GC: Serial, G1, ZGC, Shenandoah เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
การเลือกอัลกอริทึมการเก็บขยะ
JVM มาพร้อมอัลกอริทึมการเก็บขยะหลายแบบ ซึ่งแต่ละแบบปรับให้เหมาะกับปริมาณงานที่แตกต่างกัน การเลือกอัลกอริทึมที่เหมาะสมขึ้นอยู่กับขนาดฮีป ข้อกำหนดด้านเวลาแฝง และเป้าหมายด้านปริมาณงาน
// Enable GC algorithms:
// -XX:+UseSerialGC
// -XX:+UseParallelGC
// -XX:+UseG1GC (default since Java 9)
// -XX:+UseZGC (Java 15+ production)
// -XX:+UseShenandoahGC (Red Hat / OpenJDK builds)การเก็บขยะแบบอนุกรม
การเก็บขยะแบบอนุกรมใช้เธรดเดียวในการเก็บขยะ เธรดของแอปพลิเคชันทั้งหมดจะหยุดระหว่างการเก็บขยะ ("หยุดทั้งระบบ") เหมาะเฉพาะกับฮีปขนาดเล็กหรือสภาพแวดล้อมที่มี CPU เดียว เช่น ระบบฝังตัว
// Use:
// java -XX:+UseSerialGC -Xmx256m MyApp
// Pauses: long (proportional to heap size)
// Throughput: low
// Best for: CLI tools, small heaps < 100 MBการเก็บขยะแบบขนาน (ตัวเก็บขยะเน้นปริมาณงาน)
การเก็บขยะแบบขนานใช้หลายเธรดสำหรับการเก็บขยะรอบย่อยและรอบใหญ่ การหยุดทั้งระบบสั้นกว่าการเก็บขยะแบบอนุกรม แต่ยังคงมีนัยสำคัญ เหมาะที่สุดสำหรับการประมวลผลแบบกลุ่มที่ให้ความสำคัญกับปริมาณงานมากกว่าเวลาแฝง
// Use:
// java -XX:+UseParallelGC -XX:ParallelGCThreads=8 MyApp
// Pauses: moderate
// Throughput: high
// Best for: batch jobs, number crunchingการเก็บขยะแบบ G1 (เก็บขยะมากก่อน)
การเก็บขยะแบบ G1 แบ่งฮีปเป็นภูมิภาคที่มีขนาดเท่ากัน (~2 KB – 32 MB) โดยเก็บภูมิภาคที่มีขยะมากที่สุดก่อน เพื่อให้บรรลุเป้าหมายเวลาหยุดที่กำหนดค่าได้ เป็นค่าเริ่มต้นตั้งแต่ Java 9
// Use:
// java -XX:+UseG1GC -XX:MaxGCPauseMillis=200 MyApp
// Pauses: bounded by target (but not guaranteed)
// Throughput: good
// Best for: large heaps (4 GB+), mixed workloadsประเภทภูมิภาคของ G1
ภูมิภาคของ G1 จะถูกกำหนดแบบไดนามิกให้เป็นเอเดน ผู้รอดชีวิต อายุยาว หรือขนาดมหึมา (สำหรับออบเจ็กต์ขนาดใหญ่กว่า 50% ของขนาดภูมิภาค) ความยืดหยุ่นนี้ช่วยให้เก็บขยะทีละส่วนได้
ZGC (ตัวเก็บขยะแบบ Z)
ZGC ทำงานส่วนใหญ่พร้อมกันกับแอปพลิเคชัน เวลาหยุดมักต่ำกว่า 1 มิลลิวินาทีโดยไม่ขึ้นกับขนาดฮีป พร้อมใช้งานจริงตั้งแต่ Java 15
// Use:
// java -XX:+UseZGC -Xmx16g MyApp
// Pauses: < 1 ms (usually)
// Throughput: slightly lower than G1 (concurrent work has CPU cost)
// Best for: large heaps, low-latency services (APIs, trading)การเก็บขยะแบบ Shenandoah
Shenandoah จาก Red Hat ก็ทำให้เวลาหยุดต่ำกว่าหนึ่งมิลลิวินาทีได้ด้วยการจัดเรียงหน่วยความจำพร้อมกัน มีให้ใช้ในรุ่นบิลด์ของ OpenJDK โดยมีเป้าหมายคล้าย ZGC มาก แต่ใช้อัลกอริทึมภายในแตกต่างกัน
// Use:
// java -XX:+UseShenandoahGC MyApp
// Available in: Red Hat builds, some AdoptOpenJDK distributions
// Pauses: sub-millisecond
// Best for: latency-sensitive workloadsZGC แบบแบ่งตามรุ่น (Java 21 ขึ้นไป)
Java 21 เปิดตัว ZGC แบบแบ่งตามรุ่น ซึ่งผสานแนวทางเวลาหยุดต่ำของ ZGC เข้ากับการเก็บขยะแบบแบ่งรุ่น ช่วยลดภาระของ CPU ขณะที่ยังคงรักษาเวลาหยุดให้ต่ำ
// Enable in Java 21+:
// java -XX:+UseZGC -XX:+ZGenerational -Xmx8g MyAppการแลกเปลี่ยนระหว่างเวลาหยุดเก็บขยะกับปริมาณงาน
ไม่มีอัลกอริทึมการเก็บขยะแบบใดดีที่สุดในทุกด้าน การเก็บขยะแบบขนานเพิ่มปริมาณงานให้สูงสุด G1 สร้างสมดุลระหว่างปริมาณงานกับเวลาแฝง ส่วน ZGC/Shenandoah ลดเวลาหยุดให้เหลือน้อยที่สุด โดยแลกกับปริมาณงานที่ลดลงเล็กน้อย
การเปิดใช้การบันทึกข้อมูลการเก็บขยะ
บันทึกเหตุการณ์การเก็บขยะด้วย -Xlog:gc*:file=gc.log:time,uptime,level วิเคราะห์บันทึกด้วยเครื่องมืออย่าง GCViewer หรือ GCEasy เพื่อค้นหาการหยุดที่นานและช่วงการจัดสรรที่พุ่งสูง
// JVM flags:
// -Xlog:gc*:file=gc.log:time,uptime,level,tags
// Inspect logs:
// cat gc.log | grep "Pause"การตรวจสอบการเก็บขยะด้วยตัวชี้วัดของ JVM
ใช้ ManagementFactory.getGarbageCollectorMXBeans() เพื่ออ่านจำนวนและเวลาการเก็บขยะด้วยโปรแกรม หรือส่งออกข้อมูลไปยัง Prometheus ผ่าน Micrometer ในแอป Spring Boot
ManagementFactory.getGarbageCollectorMXBeans().forEach(gc ->
System.out.printf("%s: %d collections, %d ms%n",
gc.getName(), gc.getCollectionCount(), gc.getCollectionTime()));ตรวจสอบอย่างรวดเร็ว
อัลกอริทึมการเก็บขยะใดมุ่งเป้าไปที่เวลาหยุดต่ำกว่าหนึ่งมิลลิวินาทีในระบบจริง
ทบทวน
การเก็บขยะแบบอนุกรมเหมาะกับฮีปขนาดเล็กมาก การเก็บขยะแบบขนานเหมาะกับปริมาณงานแบบกลุ่ม G1 เหมาะกับงานที่ต้องการสมดุล (ค่าเริ่มต้น) และ ZGC/Shenandoah เหมาะกับเวลาแฝงที่ต่ำมาก เปิดใช้การบันทึกข้อมูลการเก็บขยะในระบบจริงเพื่อค้นหาปัญหาแต่เนิ่น ๆ
คำถามที่พบบ่อย
บทเรียน “อัลกอริทึม GC: Serial, G1, ZGC, Shenandoah” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “อัลกอริทึม GC: Serial, G1, ZGC, Shenandoah” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “อัลกอริทึม GC: Serial, G1, ZGC, Shenandoah”
เปรียบเทียบลักษณะการหยุดชั่วคราวของ GC และข้อแลกเปลี่ยนด้านปริมาณงานระหว่างตัวเก็บขยะสมัยใหม่ของ JVM คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “อัลกอริทึม GC: Serial, G1, ZGC, Shenandoah” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ภูมิภาคฮีปของ JVM และวงจรชีวิตออบเจ็กต์
- อัลกอริทึม GC: Serial, G1, ZGC, Shenandoah
- การตรวจจับและแก้ไขหน่วยความจำรั่ว
- แฟล็กปรับแต่ง GC และการทำโปรไฟล์ด้วย JVisualVM