เมื่อตัวรวบรวมขยะทำการย่อขนาดวัตถุในฮีปมันจะเปลี่ยนการอ้างอิงบนสแต็กหรือไม่


18

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

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

  1. ผ่านสแต็ก (และการอ้างอิงในฮีป) และอัปเดตการอ้างอิงเพื่อชี้ไปยังตำแหน่งใหม่ของวัตถุ ในการเปรียบเทียบกับการย้ายสิ่งนี้จะเหมือนกับการส่งจดหมายไปยังทุกคนที่มีที่อยู่ของคุณและขอให้พวกเขาอัปเดตสมุดที่อยู่ด้วยที่อยู่ใหม่ของคุณ
  2. จัดตารางการค้นหาบางประเภท นี่จะเป็นเหมือนที่อยู่สำหรับส่งต่อกับที่ทำการไปรษณีย์ท้องถิ่น

นักสะสมขยะใช้วิธีการหนึ่งในสองวิธีนี้อย่างเด่นชัดหรือไม่? วิธีอื่นบ้าง ทั้งสอง?



@StevenBurnap แก้ไขให้ฉันถ้าฉันผิด แต่ฉันเชื่อว่ากระทู้ที่คุณเชื่อมโยงไปนั้นไม่มีคำตอบที่ชัดเจน ดูเหมือนว่าพวกเขาจะคาดเดาคำถามนี้เช่นกัน ฉันอาจอ่านผิด หากพวกเขาให้คำตอบกับคำถามถ้าคุณไม่รังเกียจฉันคิดว่ามันจะเป็นประโยชน์ในการสรุปคำตอบที่นี่สำหรับผู้ใช้ SE ในอนาคต (และตัวฉันเอง!)
todorojo

คำศัพท์สำหรับสิ่งที่คุณกำลังพูดถึงคือ ฉันไม่ทราบว่าพวกเขาใช้กันอย่างไร
Gort the Robot

คำตอบ:


9

ฉันไม่มีความเชี่ยวชาญเฉพาะในเรื่องนี้ แต่ความเข้าใจของฉันคือวิธีแรกที่ใช้โดยทั่วไป

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

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


3
ฉันจะเพิ่มที่ฉันคิดว่า GC อาจพยายามที่จะไม่ย้ายสิ่งต่าง ๆ บนกองเว้นแต่พวกเขาจะต้อง ในโลกหลายโปรเซสเซอร์ในปัจจุบันมันจะต้องเป็นฝันร้ายของการซิงโครไนซ์เมื่อพวกเขาต้องการอัปเดตการอ้างอิงทั้งหมดไปยังบางสิ่งบนฮีปในขณะที่โปรแกรมที่ใช้การอ้างอิงเหล่านั้นกำลังทำงานอยู่ ตารางการค้นหาจะทำให้สิ่งนี้ง่ายขึ้น แต่ฉันคิดว่านั่นเป็นข้อยกเว้นมากกว่าปกติดังนั้น GC ส่วนใหญ่อาจต้องล็อคการอ้างอิงย้ายหน่วยความจำแล้วอัปเดตการอ้างอิง +1 คำถามที่น่าสนใจ +1 คำตอบที่ดี
GlenPeterson

3
@GlenPeterson GCs หลายคนไม่ย้ายสิ่งต่าง ๆ บนกองและไม่ประสบปัญหานี้ แต่การกระชับ GC โดยนิยามจะย้ายวัตถุที่มีชีวิตไปยังหน่วยความจำจัดเรียงข้อมูล
btilly

@GlenPeterson เป็นข้อสังเกตที่ดีว่าการเคลื่อนย้ายสิ่งของบนฮีปนั้นเป็นความเจ็บปวดที่เกิดจากการซิงโครไนซ์ขนาดใหญ่ซึ่งมักถูกมองข้ามแม้ว่าการบีบอัดของ GC จะมีผลกระทบระลอกใหญ่ในกระบวนการทำงานเนื่องจากสิ่งนี้ มันเป็นเหตุผลเดียวที่มีคนบอกให้ทำทุกอย่างเท่าที่ทำได้เพื่อให้วัตถุมีอายุสั้นที่สุดเท่าที่จะเป็นไปได้เพื่อหลีกเลี่ยงการอัพเดทฮีปขนาดใหญ่ ความไม่รู้ในสิ่งที่พฤติกรรมนี้สามารถนำไปสู่สิ่งที่เรียกว่ารักโหมด GC Freakout
จิมมี่ฮอฟฟา

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