โค้ดยิม/หลักสูตรจาวา/โมดูล 3/ประเภทของตัวรวบรวมขยะใน Java

ประเภทของตัวรวบรวมขยะใน Java

ระดับ, บทเรียน
มีอยู่

อนุกรม GC

การรวบรวมขยะช่วยปรับปรุงประสิทธิภาพของหน่วยความจำใน Java โดยการลบวัตถุที่ไม่ได้อ้างอิงออกจากฮีปและทำให้มีที่ว่างสำหรับวัตถุที่สร้างขึ้นใหม่

เครื่องเสมือน Java มีตัวรวบรวมขยะแปดประเภท ลองพิจารณารายละเอียดแต่ละข้อ

Serial GCเป็นการใช้งาน GC ที่ง่ายที่สุด มีไว้สำหรับแอปพลิเคชันขนาดเล็กที่ทำงานในสภาพแวดล้อมแบบเธรดเดียว กิจกรรมการรวบรวมขยะทั้งหมดจะดำเนินการตามลำดับในเธรดเดียวกัน การบดอัดจะดำเนินการหลังจากการเก็บรวบรวมขยะแต่ละครั้ง

อนุกรม GC

การเรียกใช้ตัวรวบรวมส่งผลให้เกิดเหตุการณ์ "โลกหยุด" ซึ่งแอปพลิเคชันทั้งหมดถูกระงับ เนื่องจากแอปพลิเคชันทั้งหมดถูกหยุดการทำงานระหว่างการรวบรวมขยะ คุณไม่ควรใช้วิธีนี้ในชีวิตจริงหากคุณต้องการลดความล่าช้าให้ต่ำที่สุด

อาร์กิวเมนต์ JVM เพื่อใช้ตัวรวบรวมขยะแบบอนุกรมคือ -XX:+ UseSerialGC

ขนาน GC

ตัวรวบรวมขยะแบบขนานได้รับการออกแบบมาสำหรับแอปพลิเคชันที่มีชุดข้อมูลขนาดกลางถึงขนาดใหญ่ที่ทำงานบนฮาร์ดแวร์แบบมัลติเธรดหรือมัลติโปรเซสเซอร์ นี่คือการใช้งาน 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 มากขึ้น

อาร์กิวเมนต์ JVM สำหรับตัวรวบรวมขยะ Shenandoah: -XX:+UnlockExperimentalVMOptions -XX:+ UseShenandoahGC

แซดจีซี

ZGCเป็นอีก GC ที่เปิดตัวโดยเป็นส่วนหนึ่งของ JDK 11 และปรับปรุงใน JDK 12

มีไว้สำหรับแอปพลิเคชันที่ต้องการความเร็วและเวลาแฝงต่ำ (หยุดชั่วคราวน้อยกว่า 10 มิลลิวินาที) และ/หรือใช้ฮีปขนาดใหญ่มาก (หลายเทราไบต์)

เป้าหมายหลักของ ZGC คือเวลาแฝงต่ำ ความสามารถในการปรับขนาด และใช้งานง่าย ในการทำเช่นนี้ จะช่วยให้แอปพลิเคชัน Java ทำงานต่อไปได้แม้ว่าการดำเนินการรวบรวมขยะกำลังดำเนินการอยู่ก็ตาม ตามค่าเริ่มต้น ZGC จะปล่อยหน่วยความจำที่ไม่ได้ใช้และส่งกลับไปยังระบบปฏิบัติการ

ดังนั้น ZGC จึงนำมาซึ่งการปรับปรุงที่สำคัญเหนือ GC แบบดั้งเดิมอื่นๆ โดยให้เวลาตายที่ต่ำมาก (โดยทั่วไปภายใน 2 มิลลิวินาที)

วัตถุประสงค์หลักของ ZGC 

อาร์กิวเมนต์ JVM ที่จะใช้ตัวรวบรวมขยะ ZGC คือ -XX:+UnlockExperimentalVMOptions -XX:+ UseZGC

ความคิดเห็น
  • เป็นที่นิยม
  • ใหม่
  • เก่า
คุณต้องลงชื่อเข้าใช้เพื่อแสดงความคิดเห็น
หน้านี้ยังไม่มีความคิดเห็นใด ๆ