อนุกรม GC
การรวบรวมขยะช่วยปรับปรุงประสิทธิภาพของหน่วยความจำใน Java โดยการลบวัตถุที่ไม่ได้อ้างอิงออกจากฮีปและทำให้มีที่ว่างสำหรับวัตถุที่สร้างขึ้นใหม่
เครื่องเสมือน Java มีตัวรวบรวมขยะแปดประเภท ลองพิจารณารายละเอียดแต่ละข้อ
Serial GCเป็นการใช้งาน GC ที่ง่ายที่สุด มีไว้สำหรับแอปพลิเคชันขนาดเล็กที่ทำงานในสภาพแวดล้อมแบบเธรดเดียว กิจกรรมการรวบรวมขยะทั้งหมดจะดำเนินการตามลำดับในเธรดเดียวกัน การบดอัดจะดำเนินการหลังจากการเก็บรวบรวมขยะแต่ละครั้ง
การเรียกใช้ตัวรวบรวมส่งผลให้เกิดเหตุการณ์ "โลกหยุด" ซึ่งแอปพลิเคชันทั้งหมดถูกระงับ เนื่องจากแอปพลิเคชันทั้งหมดถูกหยุดการทำงานระหว่างการรวบรวมขยะ คุณไม่ควรใช้วิธีนี้ในชีวิตจริงหากคุณต้องการลดความล่าช้าให้ต่ำที่สุด
อาร์กิวเมนต์ JVM เพื่อใช้ตัวรวบรวมขยะแบบอนุกรมคือ -XX:+ UseSerialGC
ขนาน GC
ตัวรวบรวมขยะแบบขนานได้รับการออกแบบมาสำหรับแอปพลิเคชันที่มีชุดข้อมูลขนาดกลางถึงขนาดใหญ่ที่ทำงานบนฮาร์ดแวร์แบบมัลติเธรดหรือมัลติโปรเซสเซอร์ นี่คือการใช้งาน GC เริ่มต้นและเรียกอีกอย่างว่าตัวรวบรวมปริมาณงาน
หลายหัวข้อถูกกำหนดให้เก็บขยะขนาดเล็กในคนรุ่นใหม่ กระทู้เดียววุ่นกับกองขยะหลักแบบรุ่นพี่
การเรียกใช้ GC แบบขนานยังทำให้โลก "หยุด" และแอปพลิเคชันหยุดทำงาน ลักษณะการทำงานนี้เหมาะสมกว่าสำหรับสภาพแวดล้อมแบบมัลติเธรดที่งานจำนวนมากจำเป็นต้องทำให้เสร็จและหยุดชั่วคราวเป็นเวลานานได้ เช่น เมื่อเรียกใช้งานแบตช์
อาร์กิวเมนต์ JVM เพื่อใช้ตัวรวบรวมขยะแบบขนานคือ-XX:+ UseParallelGC
ซีเอ็มเอส จีซี
หรือที่เรารู้จักในชื่อตัวเลือกขนานที่เหลือต่ำ
ที่นี่ สำหรับการรวบรวมขยะขนาดเล็ก มีหลายเธรดที่เกี่ยวข้อง สิ่งนี้เกิดขึ้นผ่านอัลกอริทึมเดียวกันกับในตัวรวบรวมแบบขนาน การรวบรวมขยะหลักเป็นแบบมัลติเธรด เช่นเดียวกับ GC แบบขนานแบบเก่า แต่ CMS จะทำงานพร้อมกันกับกระบวนการของแอปพลิเคชันเพื่อลดเหตุการณ์ "โลกหยุด"
ด้วยเหตุนี้ ตัวรวบรวม CMS จึงใช้ CPU มากกว่าตัวรวบรวมอื่นๆ หากคุณสามารถจัดสรร CPU ได้มากขึ้นเพื่อปรับปรุงประสิทธิภาพ CMS จะดีกว่าตัวรวบรวมแบบขนานธรรมดา CMS GC ไม่กระชับ
อาร์กิวเมนต์ JVM เพื่อใช้ตัวรวบรวมขยะแบบกวาดเครื่องหมายแบบขนานคือ-XX :+UseConcMarkSweepGC
G1 (ขยะก่อน) GC
G1GCถูกสร้างขึ้นเพื่อทดแทน CMS และได้รับการพัฒนาสำหรับแอปพลิเคชันแบบมัลติเธรดที่มีลักษณะเฉพาะด้วยขนาดฮีปขนาดใหญ่ (มากกว่า 4 GB) เป็นแบบคู่ขนานและแข่งขันได้เหมือน CMS แต่ภายใต้ประทุนนั้นทำงานแตกต่างจากตัวเก็บขยะแบบเก่ามาก
แม้ว่า G1 จะดำเนินงานโดยแบ่งตามรุ่น แต่ก็ไม่มีช่องว่างแยกสำหรับคนรุ่นใหม่และรุ่นเก่า แต่ละเจเนอเรชั่นเป็นชุดของภูมิภาค ทำให้มีความยืดหยุ่นในการเปลี่ยนขนาดของคนรุ่นใหม่
G1 แบ่งฮีปออกเป็นชุดของขอบเขตที่มีขนาดเท่าๆ กัน (ขึ้นอยู่กับขนาดของฮีป) และสแกนออกเป็นหลายๆ เธรด พื้นที่ในระหว่างการดำเนินการของโปรแกรมสามารถกลายเป็นได้ทั้งคนแก่และเด็ก
หลังจากขั้นตอนมาร์กอัปเสร็จสิ้น G1 จะรู้ว่าพื้นที่ใดมีขยะมากที่สุด หากผู้ใช้สนใจที่จะลดการหยุดชั่วคราว G1 จะสามารถเลือกพื้นที่ได้บางส่วนเท่านั้น หากเวลาหยุดชั่วคราวไม่สำคัญสำหรับผู้ใช้ หรือถ้าเวลาหยุดชั่วคราวตั้งไว้สูง G1 จะครอบคลุมพื้นที่มากขึ้น
เนื่องจาก G1 GC ระบุภูมิภาคที่มีขยะมากที่สุดและดำเนินการรวบรวมขยะในภูมิภาคเหล่านั้นก่อน จึงเรียกว่า "ขยะมาก่อน"
นอกจากพื้นที่ของ Eden, Survivors และ Old Memory แล้ว ยังมีพื้นที่อีกสองประเภทใน G1GC
- Humongous (ใหญ่) - สำหรับวัตถุขนาดใหญ่ (มากกว่า 50% ของขนาดฮีป)
- ว่าง - พื้นที่ที่ไม่ได้ใช้หรือไม่ได้จัดสรร
อาร์กิวเมนต์ JVM ที่จะใช้ตัวรวบรวมขยะ G1 คือ-XX:+ UseG1GC
เชนันโดอาห์ (ชานดารา)
Shenandoahเป็น GC ใหม่ที่ออกโดยเป็นส่วนหนึ่งของ JDK 12 ข้อได้เปรียบที่สำคัญของ Shenandoah เหนือ G1 คือวงจรการรวบรวมขยะส่วนใหญ่ทำพร้อมกันกับเธรดแอปพลิเคชัน G1 สามารถย้ายพื้นที่ฮีปได้เมื่อแอปพลิเคชันถูกระงับเท่านั้น ในขณะที่ Shenandoah ย้ายวัตถุในเวลาเดียวกันกับแอปพลิเคชัน
Shenandoah สามารถบีบอัดวัตถุที่มีชีวิต ล้างขยะ และเพิ่ม RAM เกือบจะทันทีที่พบหน่วยความจำว่าง เนื่องจากทั้งหมดนี้เกิดขึ้นพร้อมกันโดยไม่ต้องระงับแอปพลิเคชัน Shenandoah จึงใช้ CPU มากขึ้น
แซดจีซี
ZGCเป็นอีก GC ที่เปิดตัวโดยเป็นส่วนหนึ่งของ JDK 11 และปรับปรุงใน JDK 12
มีไว้สำหรับแอปพลิเคชันที่ต้องการความเร็วและเวลาแฝงต่ำ (หยุดชั่วคราวน้อยกว่า 10 มิลลิวินาที) และ/หรือใช้ฮีปขนาดใหญ่มาก (หลายเทราไบต์)
เป้าหมายหลักของ ZGC คือเวลาแฝงต่ำ ความสามารถในการปรับขนาด และใช้งานง่าย ในการทำเช่นนี้ จะช่วยให้แอปพลิเคชัน Java ทำงานต่อไปได้แม้ว่าการดำเนินการรวบรวมขยะกำลังดำเนินการอยู่ก็ตาม ตามค่าเริ่มต้น ZGC จะปล่อยหน่วยความจำที่ไม่ได้ใช้และส่งกลับไปยังระบบปฏิบัติการ
ดังนั้น ZGC จึงนำมาซึ่งการปรับปรุงที่สำคัญเหนือ GC แบบดั้งเดิมอื่นๆ โดยให้เวลาตายที่ต่ำมาก (โดยทั่วไปภายใน 2 มิลลิวินาที)
อาร์กิวเมนต์ JVM ที่จะใช้ตัวรวบรวมขยะ ZGC คือ -XX:+UnlockExperimentalVMOptions -XX:+ UseZGC
GO TO FULL VERSION