Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

คุณคิดว่าตัวรวบรวมขยะสามารถติดตามวัตถุ Python ทั้งหมดได้หรือไม่


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

คลาส Python ทั้งหมดและอินสแตนซ์ของคลาสจะถูกติดตามโดย cyclic gc ประเภทที่กำหนดไว้ใน C ไม่ได้เว้นแต่พวกเขาใช้ความพยายามเพียงเล็กน้อย ประเภทบิวด์อินทั้งหมดที่อาจเป็นส่วนหนึ่งของวัฏจักรได้ แต่นี่หมายความว่าโมดูล gc รู้เฉพาะประเภทที่เล่นได้เท่านั้น

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