คำถามติดแท็ก garbage-collection

12
ทำไมคอมไพเลอร์ไม่ใส่ deallocations โดยอัตโนมัติ?
ในภาษาเช่น C โปรแกรมเมอร์คาดว่าจะแทรกการโทรฟรี ทำไมคอมไพเลอร์ไม่ทำสิ่งนี้โดยอัตโนมัติ มนุษย์ทำในเวลาที่เหมาะสม (ไม่สนใจข้อบกพร่อง) ดังนั้นจึงเป็นไปไม่ได้ แก้ไข: สำหรับการอ้างอิงในอนาคตนี่คือการสนทนาอื่นที่มีตัวอย่างที่น่าสนใจ

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

7
เหตุใดกระบวนทัศน์ของผู้ทำลายล้างวัตถุในภาษาที่รวบรวมขยะจึงหายไปอย่างแพร่หลาย?
กำลังมองหาข้อมูลเชิงลึกเกี่ยวกับการตัดสินใจเกี่ยวกับการออกแบบภาษาที่รวบรวมขยะ บางทีผู้เชี่ยวชาญด้านภาษาสามารถสอนฉัน ฉันมาจากพื้นหลัง C ++ ดังนั้นพื้นที่นี้ทำให้ฉันงุนงง ดูเหมือนว่าภาษาที่รวบรวมขยะสมัยใหม่เกือบทั้งหมดที่มีการสนับสนุนวัตถุ OOPy เช่น Ruby, Javascript / ES6 / ES7, Actionscript, Lua และอื่น ๆ จะไม่ใช้ destructor / finalize paradigm Python ดูเหมือนจะเป็นคนเดียวที่มีclass __del__()วิธีการ ทำไมนี้ มีข้อ จำกัด ด้านการทำงาน / ทางทฤษฎีในภาษาที่มีการรวบรวมขยะอัตโนมัติซึ่งป้องกันการใช้งานที่มีประสิทธิภาพของวิธีการ destructor / จบบนวัตถุ? ฉันพบว่าภาษาเหล่านี้ไม่ได้พิจารณาถึงความทรงจำเป็นอย่างยิ่งเพราะเป็นเพียงการจัดการทรัพยากร เกี่ยวกับซ็อกเก็ตตัวจัดการไฟล์สถานะแอปพลิเคชัน หากปราศจากความสามารถในการใช้ตรรกะที่กำหนดเองเพื่อล้างทรัพยากรที่ไม่ใช่หน่วยความจำและสถานะในการสรุปวัตถุฉันต้องทำให้แอปพลิเคชั่นของฉันมีmyObject.destroy()สไตล์การโทรที่กำหนดเองวางตรรกะการล้างข้อมูลนอก "คลาส" ของฉัน การประยุกต์ใช้กับการรั่วไหลของทรัพยากรเนื่องจากข้อผิดพลาดของมนุษย์มากกว่าจะถูกจัดการโดย gc โดยอัตโนมัติ การตัดสินใจออกแบบภาษาที่นำไปสู่ภาษาเหล่านี้ไม่มีวิธีใดในการดำเนินการตรรกะที่กำหนดเองในการกำจัดวัตถุคืออะไร? ฉันต้องจินตนาการว่ามีเหตุผลที่ดี ฉันต้องการเข้าใจการตัดสินใจทางเทคนิคและทางทฤษฎีที่ทำให้ภาษาเหล่านี้ไม่สนับสนุนการทำลายวัตถุ / การสรุป ปรับปรุง: …

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

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

6
เหตุใดการรวบรวมขยะจึงขยายไปยังหน่วยความจำเท่านั้นและไม่ใช่ประเภททรัพยากรอื่น ๆ
ดูเหมือนว่าผู้คนเบื่อการจัดการหน่วยความจำด้วยตนเองดังนั้นพวกเขาจึงคิดค้นการรวบรวมขยะและชีวิตก็ดีพอสมควร แล้วทรัพยากรประเภทอื่น ๆ ล่ะ? อธิบายไฟล์, ซ็อกเก็ตหรือแม้กระทั่งข้อมูลที่ผู้ใช้สร้างขึ้นเช่นการเชื่อมต่อฐานข้อมูล? นี่รู้สึกเหมือนเป็นคำถามที่ไร้เดียงสา แต่ฉันไม่สามารถหาที่ใดก็ได้ที่มีคนถาม ลองพิจารณาตัวอธิบายไฟล์ สมมติว่าโปรแกรมรู้ว่าจะอนุญาตให้มี 4000 fds เท่านั้นเมื่อเริ่มทำงาน เมื่อใดก็ตามที่มันทำการดำเนินการที่จะเปิดไฟล์อธิบายสิ่งที่มันจะ ตรวจสอบให้แน่ใจว่าไม่ได้กำลังจะหมด หากเป็นเช่นนั้นให้เรียกตัวเก็บรวบรวมขยะซึ่งจะทำให้หน่วยความจำว่างมากขึ้น หากหน่วยความจำบางส่วนถูกปล่อยให้อ้างอิงกับตัวให้คำอธิบายไฟล์ให้ปิดทันที มันรู้ว่าหน่วยความจำเป็นของทรัพยากรเพราะหน่วยความจำที่เชื่อมโยงกับทรัพยากรนั้นได้รับการลงทะเบียนใน 'file descriptor registry' เนื่องจากไม่มีคำศัพท์ที่ดีกว่าเมื่อมันถูกเปิดครั้งแรก เปิดตัวให้คำอธิบายไฟล์ใหม่คัดลอกลงในหน่วยความจำใหม่ลงทะเบียนตำแหน่งหน่วยความจำนั้นใน 'ตัวให้คำอธิบายไฟล์' และส่งคืนไปยังผู้ใช้ ดังนั้นทรัพยากรจะไม่ถูกปล่อยออกมาโดยทันที แต่มันจะถูกปล่อยให้เป็นอิสระเมื่อใดก็ตามที่ gc วิ่งซึ่งรวมถึงอย่างน้อยที่สุดก่อนที่ทรัพยากรจะหมดลงโดยสมมติว่ามันไม่ได้ถูกใช้ทั้งหมด และดูเหมือนว่าจะเพียงพอสำหรับปัญหาการล้างทรัพยากรที่ผู้ใช้กำหนด ฉันจัดการเพื่อค้นหาความคิดเห็นเดียวที่นี่ที่อ้างอิงทำล้างคล้ายกับใน C ++ กับกระทู้ที่มีการอ้างอิงไปยังทรัพยากรและล้างมันขึ้นเมื่อมีเพียงการอ้างอิงเดียวที่เหลืออยู่ (จากเธรดการล้างข้อมูล) แต่ฉันสามารถ ' ไม่พบหลักฐานการเป็นห้องสมุดหรือส่วนหนึ่งของภาษาที่มีอยู่

3
การอ้างอิงการนับ GC กับการติดตาม GC เป็นคุณสมบัติภาษาหรือคุณสมบัติการใช้งานหรือไม่
บางครั้งเราได้ยินคำว่า "สวิฟท์ไม่ได้ทำคลาสสิก (ติดตาม) GC จะใช้ ARC." แต่ฉันไม่แน่ใจว่ามีอะไรใน Swant semantics ที่ต้องใช้การนับการอ้างอิง ดูเหมือนว่าเราสามารถสร้างคอมไพเลอร์ Swift และรันไทม์ของตัวเองเพื่อใช้การติดตาม GC ดังนั้น "อ้างอิงนับ" เกี่ยวกับ Swift คืออะไร? การใช้งานแอปเปิ้ลหรือภาษาตัวเองหรือไม่ มีบางส่วนของภาษาหรือไลบรารีที่สนับสนุน ARC อย่างยิ่งซึ่งเราสามารถใช้ป้ายกำกับนั้นสำหรับภาษานั้น ๆ ได้หรือไม่?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.