โดยสรุป : ตัวรวบรวมขยะไม่ได้ใช้การเรียกซ้ำ พวกเขาเพียงแค่ควบคุมการติดตามโดยการติดตามสองชุด (ซึ่งอาจรวมกัน) ลำดับของการติดตามและการประมวลผลเซลล์ไม่เกี่ยวข้องซึ่งให้อิสระในการนำไปใช้อย่างมากเพื่อเป็นตัวแทนชุด ดังนั้นจึงมีวิธีแก้ปัญหามากมายที่จริง ๆ แล้วถูกมากในการใช้หน่วยความจำ นี่เป็นสิ่งจำเป็นเนื่องจาก GC เรียกอย่างแม่นยำเมื่อฮีปหมดหน่วยความจำ สิ่งที่มีความแตกต่างกันเล็กน้อยกับความทรงจำเสมือนขนาดใหญ่เป็นหน้าใหม่ที่สามารถจัดสรรได้อย่างง่ายดายและ ennemy จะขาดไม่ได้ของพื้นที่ แต่ขาดข้อมูล
ท้องถิ่น
ฉันถือว่าคุณกำลังพิจารณาการติดตามตัวรวบรวมขยะไม่ใช่การนับการอ้างอิงที่คำถามของคุณดูเหมือนจะไม่นำมาใช้
คำถามคือเพ่งความสนใจไปที่ค่าใช้จ่ายหน่วยความจำของการติดตามเพื่อติดตามชุด: ชุด (สำหรับ untraced) ของเซลล์หน่วยความจำที่เข้าถึงได้ซึ่งยังคงมีตัวชี้ที่ยังไม่ได้ติดตาม นี่เป็นเพียงครึ่งหนึ่งของปัญหาหน่วยความจำU
สำหรับการรวบรวมขยะ GC จะต้องติดตามชุดอื่น: ชุด (สำหรับเยี่ยมชม) ของเซลล์ทั้งหมดที่พบว่าสามารถเข้าถึงได้เพื่อที่จะเรียกคืนเซลล์อื่น ๆ ทั้งหมดในตอนท้ายของกระบวนการ การพูดคุยอย่างใดอย่างหนึ่งและไม่ใช่เรื่องอื่นทำให้รู้สึก จำกัด เนื่องจากอาจมีค่าใช้จ่ายที่คล้ายคลึงกันใช้วิธีแก้ไขปัญหาที่คล้ายกันV
สิ่งแรกที่ควรทราบคือการติดตาม GC ทั้งหมดจะทำตามแบบจำลองนามธรรมที่เหมือนกันโดยขึ้นอยู่กับการสำรวจอย่างเป็นระบบของกราฟกำกับของเซลล์ในหน่วยความจำที่สามารถเข้าถึงได้จากโปรแกรมซึ่งเซลล์หน่วยความจำนั้นเป็นจุดยอดและพอยน์เตอร์ มันใช้สำหรับชุดดังต่อไปนี้:
ชุด (เยี่ยมชม) ของเซลล์พบว่าสามารถเข้าถึงได้โดยMutatorเช่นโปรแกรมหรืออัลกอริทึมที่ GC ดำเนินการ ชุดVถูกแบ่งพาร์ติชันออกเป็นชุดย่อยที่แยกกันสองชุด:
V = U ∪ T ;VVV=U∪T
set (untraced) ของเซลล์ที่เยี่ยมชมพร้อมด้วยพอยน์เตอร์ที่ยังไม่ได้ติดตามU
ชุด (ติดตาม) ของเซลล์ที่เยี่ยมชมซึ่งมีการติดตามพอยน์เตอร์ทั้งหมดT
เรายังทราบชุดของเซลล์ทั้งหมดในกองไม่ว่าจะมีการใช้งานหรือไม่H
เฉพาะและUหรือUและTเท่านั้นที่ต้องแสดงอัลกอริธึมในการทำงานVUUT
ขั้นตอนวิธีการเริ่มต้นจากบางส่วนชี้รากที่เป็นที่รู้จักกับระบบเวลาทำงาน (มักจะชี้ในการจัดสรรหน่วยความจำสแต็ค) และทำให้เซลล์ทั้งหมดที่พวกเขาชี้ไปในชุด untraced (เพราะฉะนั้นในVเกินไป)UV
จากนั้นจะใช้เวลาสะสมเซลล์ในหนึ่งโดยหนึ่งและการตรวจสอบสำหรับแต่ละเซลล์คชี้ทั้งหมด สำหรับตัวชี้แต่ละตัวหากเซลล์ปลายแหลมอยู่ในVจะไม่มีการทำอะไรเลยนอกจากนี้เซลล์ปลายแหลมจะถูกเพิ่มไปยังUเนื่องจากตัวชี้ยังไม่ได้ตรวจสอบ เมื่อทุกตัวชี้ที่ได้รับการประมวลผลเซลล์คจะถูกโอนจากชุด untraced UไปยังชุดสืบTUcVUcUT
UUV=TVH−VVในฮีปจะกำหนดว่าเซลล์ใดที่ไม่สามารถเข้าถึงได้โดยโปรแกรม mutator และสามารถเรียกคืนได้โดยตัวสะสมสำหรับการจัดสรรในอนาคตให้กับ mutator
VUUTซึ่งแสดงอย่างมีประสิทธิภาพ
ฉันยังข้ามรายละเอียดเกี่ยวกับเซลล์คืออะไรไม่ว่ามันจะมีขนาดเดียวหรือหลายขนาดเราจะหาพอยน์เตอร์ในตัวของพวกเขาอย่างไรพวกมันอาจถูกบีบอัดได้อย่างไรรวมถึงปัญหาทางเทคนิคอื่น ๆ ที่คุณสามารถหาได้จากหนังสือ .
U
อะไรก็ตามที่ทำให้สามารถระบุเซ็ตได้และทำสิ่งที่ถูกต้องพอที่จะทำ โปรดทราบว่าลำดับที่เซลล์ถูกประมวลผลนั้นไม่เกี่ยวข้อง (ไม่จำเป็นต้องมีสแนปดาวน์แบบพิเศษ) ซึ่งให้อิสระอย่างมากในการเลือกวิธีการที่จะแสดงชุดได้อย่างมีประสิทธิภาพ
ในกรณีที่การใช้งานที่รู้จักแตกต่างกันนั้นเป็นไปตามที่ชุดเหล่านี้ถูกนำเสนอจริง มีการใช้เทคนิคหลายอย่างจริง:
บิตแม็พ: พื้นที่หน่วยความจำบางส่วนถูกสงวนไว้สำหรับแผนที่ที่มีหนึ่งบิตสำหรับแต่ละเซลล์หน่วยความจำซึ่งสามารถพบได้โดยใช้ที่อยู่ของเซลล์ บิตจะเปิดเมื่อเซลล์ที่เกี่ยวข้องอยู่ในชุดที่กำหนดโดยแผนที่ หากใช้แผนที่บิตเพียงอย่างเดียวคุณต้องมีเพียง 2 บิตต่อเซลล์
หรือคุณอาจมีพื้นที่สำหรับแท็กบิตพิเศษ (หรือ 2) ในแต่ละเซลล์เพื่อทำเครื่องหมาย
log2pp
คุณอาจทดสอบภาคแสดงเกี่ยวกับเนื้อหาของเซลล์และพอยน์เตอร์ของมัน
คุณสามารถย้ายเซลล์ในส่วนที่ว่างของหน่วยความจำสำหรับเซลล์ทั้งหมดที่อยู่ในชุดที่เป็นตัวแทนเท่านั้น
VTTU
คุณอาจรวมเทคนิคเหล่านี้เข้าด้วยกันแม้จะเป็นชุดเดียวก็ตาม
ดังที่ได้กล่าวมาทั้งหมดข้างต้นได้ถูกนำไปใช้โดยบางคนเก็บขยะดำเนินการแปลกที่บางคนอาจดูเหมือน ทุกอย่างขึ้นอยู่กับข้อ จำกัด ต่าง ๆ ของการใช้งาน และพวกเขาค่อนข้างถูกในการใช้หน่วยความจำอาจช่วยโดยการประมวลผลนโยบายการสั่งซื้อที่สามารถเลือกได้อย่างอิสระสำหรับวัตถุประสงค์นั้นเนื่องจากพวกเขาไม่สำคัญสำหรับผลลัพธ์สุดท้าย
สิ่งที่อาจดูแปลกประหลาดที่สุดคือการถ่ายโอนเซลล์ในพื้นที่ใหม่เป็นเรื่องธรรมดามาก: เรียกว่าการเก็บสำเนา ส่วนใหญ่จะใช้กับหน่วยความจำเสมือน
เห็นได้ชัดว่าไม่มีการเรียกซ้ำและไม่จำเป็นต้องใช้อัลกอริธึม Mutator
อีกจุดที่สำคัญคือการที่ประชาคมโลกที่ทันสมัยมากจะดำเนินการสำหรับความทรงจำเสมือนขนาดใหญ่ จากนั้นรับพื้นที่ที่จะใช้งานและรายการพิเศษหรือสแต็กไม่ใช่ปัญหาเนื่องจากสามารถจัดสรรหน้าใหม่ได้ง่าย อย่างไรก็ตามในความทรงจำเสมือนขนาดใหญ่ennemy จะขาดไม่ได้ของพื้นที่ แต่ขาดของท้องถิ่น จากนั้นโครงสร้างที่เป็นตัวแทนของชุดและการใช้งานของพวกเขาจะต้องมุ่งสู่การอนุรักษ์สถานที่ของโครงสร้างข้อมูลและการดำเนินการของ GC ปัญหาไม่ใช่ที่ว่าง แต่เป็นเวลา การใช้งานที่ไม่เพียงพอมีแนวโน้มที่จะแสดงการชะลอตัวที่ยอมรับไม่ได้มากกว่าหน่วยความจำล้น
ฉันไม่ได้ให้การอ้างอิงถึงอัลกอริทึมเฉพาะจำนวนมากซึ่งเป็นผลมาจากการรวมกันของเทคนิคเหล่านี้เนื่องจากดูเหมือนจะนานพอ