นักสะสมขยะทั่วไปคือแคชที่เป็นมิตรโดยเนื้อแท้หรือไม่?


38

ตัวรวบรวมขยะทั่วไปจะเก็บข้อมูลที่จัดสรรไว้ล่าสุดในส่วนหน่วยความจำแยก ในโปรแกรมทั่วไปข้อมูลจำนวนมากมีอายุสั้นดังนั้นการรวบรวมขยะเล็ก (วงจร GC เล็กน้อย) บ่อยครั้งและการรวบรวมขยะเก่านาน ๆ ครั้งเป็นการประนีประนอมระหว่างค่าใช้จ่ายหน่วยความจำและเวลาที่ใช้ในการทำ GC

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


การสนทนาเมตาที่เกี่ยวข้องเกี่ยวกับแท็กที่เหมาะสมสำหรับคำถาม
Kaveh

คำตอบ:


19

ต่อไปนี้เป็นเอกสารสองสามฉบับที่พูดถึงผลกระทบของแคชของผู้รวบรวมขยะทั่วไป:

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


10

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

ตัวสะสม generational จะมุ่งเน้นไปที่สิ่งที่บางครั้งเรียกว่าพื้นที่ "เรือนเพาะชำ" แต่ในที่สุดมันก็จะต้อง / รวบรวมในพื้นที่รุ่น "เก่า" อย่างหลีกเลี่ยงไม่ได้ก่อให้เกิดการสแกนหน่วยความจำเต็ม

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

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

ในคำอื่น ๆ สำหรับ "ส่วนใหญ่" ของการดำเนินการของสะสมแคชอาจจะช่วยได้ (แคชและพื้นที่เพาะชำ "เด็ก" โดยทั่วไปจะทับซ้อนกัน!) แต่มีระยะสม่ำเสมอต่อเนื่องในที่สุดหลีกเลี่ยงไม่ได้หนัก อาจจะถึงขนาด "ใหญ่" [การย่อยสลาย] ในประสิทธิภาพเมื่อพื้นที่ "รุ่นเก่า" ถูกเก็บรวบรวมเต็มรูปแบบและแคช "อัตราการเข้าชม" จะลดลงจนแย่มากเนื่องจากวัตถุจำนวนมากที่อยู่ด้านนอกเต็มไปด้วยความหนาแน่น สแกน / รวบรวมรอบ กล่าวอีกนัยหนึ่งความไม่ต่อเนื่องเป็นระยะ ๆ ซึ่งหลีกเลี่ยงไม่ได้ (โดยที่การประมาณการทางสถิติ / ค่าเฉลี่ย / แนวโน้มของประสิทธิภาพ ฯลฯ ทำให้เข้าใจผิดและไม่เหมาะสม)

สิ่งที่เกิดขึ้นในขณะนี้คือระบบคอลเลกชันใหม่ที่ออกแบบมาเพื่อเชื่อมโยงกับระบบการจัดการหน่วยความจำพื้นฐาน (การแคช / การจำลองเสมือน) ปรากฏว่าวิธีการทางประวัติศาสตร์ที่แยกระบบการรวบรวมหน่วยความจำแคชและการจำลองเสมือนทั้งหมดจะไม่ทำงานเช่นเดียวกับวิธีการที่รวม / รวม / ที่อยู่ทั้งสามด้านเข้าด้วยกัน

ดูตัวอย่างเช่นการเก็บขยะโดย Zhou และ Demsky


ดังนั้นคุณสามารถยืนยันได้ว่า generational GCs นั้นเป็นมิตรกับแคชเมื่อเทียบกับรุ่นที่ไม่ใช่รุ่นทั่วไป
Raphael

ฉันจะยืนยันว่า GC ควรได้รับการออกแบบในลักษณะผสมผสานกับแคชและหน่วยความจำเสมือนเป็นส่วนหนึ่งของการออกแบบซึ่งมีความยุ่งยากในสถาปัตยกรรมที่มีอยู่ อย่างไรก็ตามเพื่อขยายคำตอบ - ใช่ผู้สะสมรุ่นรวมรวม / consolodate / กลุ่มวัตถุที่ใช้บ่อยในหน่วยความจำที่ต่อเนื่องกันซึ่งจะแคชเข้ากันได้โดยเนื้อแท้มากขึ้นกว่าการออกแบบอื่น ๆ ที่วัตถุที่ใช้บ่อยและไม่บ่อยนักจะกระจาย / intermixed จะยังคงมีประโยชน์แคช)
vzn

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