อัลกอริทึมที่อยู่เบื้องหลังการหยุด GC ชั่วคราวมีอะไรบ้าง


12

บางภาษาสำหรับจาวา exemple ได้แนะนำ GC ชั่วคราว

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

ดังนั้นโดยพื้นฐานแล้วอัลกอริธึมคืออะไร?

บทความวิจัยหรือลิงค์บทความทางเทคนิคจริง ๆ จะถือว่าเป็นคำตอบที่ถูกต้องเนื่องจากหัวข้อนี้เป็นเรื่องทางเทคนิคจริงๆ

คำตอบ:


16

ดังนั้นโดยพื้นฐานแล้วอัลกอริธึมคืออะไร?

มันเป็นอัลกอริธึมการทำเครื่องหมายและการกวาดซึ่ง "เพิ่ง" ทำงานพร้อมกันในเธรดแยกต่างหาก

สำหรับงานวิจัยในหัวข้อนั้น:


5

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

นี่คือคำอธิบายจาก Jeremy Manson :

หลักการง่าย ๆ : ตัวรวบรวมจะแยกฮีปขึ้นเป็นภูมิภาคขนาดคงที่และติดตามข้อมูลสดในภูมิภาคเหล่านั้น มันเก็บชุดพอยน์เตอร์ - "ชุดที่จดจำ" - เข้าและออกนอกภูมิภาค เมื่อจำเป็นต้องมี GC มันจะรวบรวมภูมิภาคที่มีข้อมูลสดน้อยกว่าก่อน (ดังนั้น "ขยะครั้งแรก") บ่อยครั้งสิ่งนี้อาจหมายถึงการรวบรวมทั้งภูมิภาคในขั้นตอนเดียว: หากจำนวนพอยน์เตอร์ในภูมิภาคเป็นศูนย์แล้วไม่จำเป็นต้องทำเครื่องหมายหรือกวาดพื้นที่ ...

  • นี่คือกระดาษด้านเทคนิคจากวิศวกรของ Sun ที่อธิบายการออกแบบ: Garbage-First Garbage Collection

5

JVM แบบเรียลไทม์ของ IBM ใช้ตัวรวบรวมขยะที่ชื่อMetronomeซึ่งแยกกิจกรรม GC ออกเป็นควอนตัมแบบแยกและสอดแทรกการประมวลผลแอ็พพลิเคชัน ดังนั้นโดยทั่วไปแทนที่จะหยุดชั่วคราว GC (และไม่ใช่แบบกำหนดเวลา) โลกแอปพลิเคชันจะทำงานช้าลงเล็กน้อยในขณะที่ GC ทำแบบขนาน

มี GC อีกตัวที่ทำการจัดเรียงข้อมูลแบบไดนามิกและตรงตามข้อกำหนดแบบเรียลไทม์ แต่การอ้างอิงเดียวที่ฉันสามารถหาได้คือที่นี่ (จำเป็นต้องเป็นสมาชิก ACM)

พร้อมกันเก็บขยะแบบ real-time ที่น่าสนใจคือstopless มันใช้วิธีการทำเครื่องหมายและกวาดแบบดั้งเดิม แต่ถูกออกแบบมาสำหรับใช้กับระบบมัลติโปรเซสเซอร์และรองรับมัลติเธรดพร้อมกันแบบล็อคฟรี


เยี่ยมมาก! น่าเสียดายที่ฉันไม่สามารถเข้าถึง ACM ได้บทความนี้ดูน่าสนใจจริงๆ
deadalnix

2

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

ฉันขอแนะนำสำหรับการกลายพันธุ์ที่พวกเขาใช้รูปแบบของการคัดลอกเมื่อเขียนเพื่อแจ้ง GC เกี่ยวกับการเปลี่ยนแปลง


ที่ไม่เพียงพอตราบเท่าที่การอ้างอิงเหล่านี้สามารถปรับปรุงได้ตลอดเวลาโดยเธรดใด ๆ
deadalnix
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.