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

10
เป็นความคิดที่ดีที่จะบังคับให้มีการรวบรวมขยะเมื่อใด
ดังนั้นผมอ่านคำถามเกี่ยวกับการบังคับให้ C # เก็บขยะในการทำงานที่เกือบทุกคำตอบเดียวเหมือนกัน: คุณสามารถทำมัน แต่คุณไม่ควร - ยกเว้นบางกรณีที่หายากมาก น่าเศร้าที่ไม่มีใครมีรายละเอียดเกี่ยวกับกรณีเช่นนี้ คุณช่วยบอกฉันได้ไหมว่ามันเป็นความคิดที่ดีหรือสมเหตุสมผลในการจัดเรียงขยะ? ฉันไม่ได้ขอเฉพาะกรณี C # แต่ทุกภาษาโปรแกรมที่มีตัวเก็บขยะ ฉันรู้ว่าคุณไม่สามารถบังคับให้ GC กับทุกภาษาเช่น Java ได้ แต่ลองสมมติว่าคุณทำได้

6
หน่วยความจำ Stack และ Heap ใน Java
ดังที่ฉันเข้าใจใน Java หน่วยความจำสแต็คจะเก็บข้อมูลพื้นฐานและวิธีการเรียกใช้และหน่วยความจำฮีปใช้เพื่อจัดเก็บวัตถุ สมมติว่าฉันมีชั้นเรียน class A { int a ; String b; //getters and setters } ดั้งเดิมaในชั้นเรียนAจะถูกเก็บไว้ที่ไหน เหตุใดหน่วยความจำฮีปจึงมีอยู่ทั้งหมด ทำไมเราไม่เก็บทุกอย่างไว้ในกองซ้อน? เมื่อวัตถุได้รับการรวบรวมขยะสแต็กที่เกี่ยวข้องกับวัตถุที่ถูกทำลายจะถูกจัดเก็บหรือไม่?

6
การรวบรวมขยะทำงานในภาษาที่เรียบเรียงอย่างไร
หลังจากการเรียกดูคำตอบหลายกองมากเกินก็เป็นที่ชัดเจนว่าบางภาษาเรียบเรียงโดยกำเนิดมีการเก็บขยะ แต่มันก็ไม่ชัดเจนสำหรับฉันว่ามันจะทำงานอย่างไร ฉันเข้าใจว่าการรวบรวมขยะสามารถทำงานกับภาษาที่ตีความได้อย่างไร ตัวรวบรวมขยะจะทำงานพร้อมกับล่ามและลบวัตถุที่ไม่ได้ใช้และไม่สามารถเข้าถึงได้ออกจากหน่วยความจำของโปรแกรม พวกเขาทั้งสองทำงานร่วมกัน สิ่งนี้จะทำงานกับภาษาที่คอมไพล์ได้อย่างไร? ความเข้าใจของฉันคือเมื่อคอมไพเลอร์ได้รวบรวมซอร์สโค้ดไปยังรหัสเป้าหมาย - โดยเฉพาะรหัสเครื่องดั้งเดิม - ก็เสร็จแล้ว งานเสร็จสิ้นแล้ว ดังนั้นโปรแกรมที่คอมไพล์แล้วจะเก็บขยะได้อย่างไร? คอมไพเลอร์ทำงานร่วมกับ CPU ในบางวิธีในขณะที่โปรแกรมทำงานเพื่อลบวัตถุ "ขยะ" หรือไม่ หรือคอมไพเลอร์มีตัวรวบรวมขยะน้อยที่สุดในการปฏิบัติการของโปรแกรมที่คอมไพล์แล้วหรือไม่ ฉันเชื่อว่าคำสั่งหลังของฉันจะมีความถูกต้องมากกว่าเดิมเนื่องจากข้อความที่ตัดตอนมาจากคำตอบนี้ใน Stack Overflow : ภาษาโปรแกรมหนึ่งนั้นคือไอเฟล คอมไพเลอร์ไอเฟลส่วนใหญ่สร้างรหัส C สำหรับเหตุผลในการพกพา รหัส C นี้ใช้เพื่อสร้างรหัสเครื่องโดยคอมไพเลอร์ C มาตรฐาน Eiffel implementations ให้ GC (และบางครั้งก็แม่นยำ GC) สำหรับโค้ดที่คอมไพล์นี้และไม่จำเป็นสำหรับ VM โดยเฉพาะอย่างยิ่ง VisualEiffel คอมไพเลอร์สร้างรหัสเครื่อง x86 พื้นเมืองโดยตรงกับการสนับสนุน คำสั่งสุดท้ายดูเหมือนจะบ่งบอกว่าคอมไพเลอร์มีบางโปรแกรมในปฏิบัติการสุดท้ายซึ่งทำหน้าที่เป็นตัวเก็บรวบรวมขยะในขณะที่โปรแกรมกำลังทำงาน หน้าบนเว็บไซต์D ภาษาเกี่ยวกับการรวบรวมขยะ - ซึ่งถูกรวบรวมไว้อย่างเป็นธรรมชาติและมีที่เก็บขยะทางเลือก …

11
เหตุใดจึงไม่ลบวัตถุ Java ทันทีหลังจากที่ไม่มีการอ้างอิงอีกต่อไป
ใน Java ทันทีที่วัตถุไม่มีการอ้างอิงใด ๆ อีกต่อไปวัตถุนั้นจะมีสิทธิ์ในการลบ แต่ JVM จะตัดสินใจเมื่อวัตถุถูกลบจริง ในการใช้คำศัพท์ Objective-C การอ้างอิง Java ทั้งหมดจะ "แข็งแรง" โดยเนื้อแท้ อย่างไรก็ตามใน Objective-C หากวัตถุไม่มีการอ้างอิงที่แข็งแกร่งอีกต่อไปวัตถุจะถูกลบทันที เหตุใดจึงไม่เป็นเช่นนี้ใน Java

11
ทำไมต้องมีการรวบรวมขยะหากตัวชี้สมาร์ทอยู่ที่นั่น
วันนี้มีหลายภาษาที่เก็บขยะ มันยังสามารถใช้ได้สำหรับ C ++ โดยบุคคลที่สาม แต่ C ++ มี RAII และตัวชี้อัจฉริยะ ดังนั้นจุดประสงค์ของการใช้การรวบรวมขยะคืออะไร? มันทำอะไรพิเศษหรือไม่? และในภาษาอื่นเช่น C # หากการอ้างอิงทั้งหมดถูกใช้เป็นพอยน์เตอร์อัจฉริยะ (เก็บ RAII ไว้) ตามสเปคและการใช้งานจะยังคงมีความต้องการของนักสะสมขยะหรือไม่? ถ้าไม่เป็นเช่นนั้นทำไมจึงไม่เป็นเช่นนั้น

16
เหตุใดภาษาเช่น C และ C ++ จึงไม่มีการรวบรวมขยะในขณะที่ Java ทำ [ปิด]
ฉันรู้ว่ามีหลายอย่างเช่น malloc / free สำหรับ C และใหม่ / using-a-destructor สำหรับการจัดการหน่วยความจำใน C ++ แต่ฉันสงสัยว่าทำไมไม่มี "การอัพเดทใหม่" สำหรับภาษาเหล่านี้ที่ทำให้ผู้ใช้ มีตัวเลือกในการจัดการหน่วยความจำด้วยตนเองหรือสำหรับระบบที่จะทำโดยอัตโนมัติ (เก็บขยะ)? ค่อนข้างเป็นคำถามที่แปลกใหม่ แต่อยู่ใน CS ประมาณ 1 ปีเท่านั้น

6
เมื่อใดควรใช้การอ้างอิงที่อ่อนแอใน. Net
ฉันไม่ได้เจอกับสถานการณ์ที่ฉันต้องการใช้ WeakReference ใน. Net แต่โดยส่วนตัวแล้วความเชื่อที่ได้รับความนิยมดูเหมือนว่าควรจะใช้ในแคช ดรจอน Harrop ให้กรณีที่ดีมากกับการใช้งานของ WeakReferences ในแคชของเขาในคำตอบไปนี้คำถาม ฉันมักจะได้ยินนักพัฒนา AS3 พูดคุยเกี่ยวกับการใช้การอ้างอิงที่อ่อนแอเพื่อบันทึกในหน่วยความจำ แต่จากการสนทนาที่ฉันมีมันดูเหมือนว่าจะเพิ่มความซับซ้อนโดยไม่จำเป็นต้องบรรลุเป้าหมายที่กำหนดไว้และพฤติกรรมของรันไทม์ค่อนข้างไม่แน่นอน มากเสียจนหลายคนยอมแพ้และจัดการการใช้หน่วยความจำอย่างระมัดระวังมากขึ้น / เพิ่มประสิทธิภาพรหัสของพวกเขาเพื่อให้หน่วยความจำน้อยมาก (หรือทำให้การแลกเปลี่ยนรอบ CPU และหน่วยความจำขนาดเล็กลง) ดร. จอน Harrop ยังชี้ให้เห็นในคำตอบของเขาว่าการอ้างอิงที่อ่อนแอของ. Net นั้นไม่นุ่มนวลและมีการรวบรวมการอ้างอิงที่อ่อนแอใน gen0 จากการอ้างอิงของMSDNการอ้างอิงที่ไม่รัดกุมจะช่วยให้คุณสามารถสร้างวัตถุใหม่ได้but the state of the object remains unpredictable.! จากลักษณะเหล่านี้ฉันไม่สามารถนึกถึงสถานการณ์ที่การอ้างอิงที่อ่อนแอจะมีประโยชน์บางทีใครบางคนสามารถทำให้ฉันเข้าใจได้

8
เกิดอะไรขึ้นกับขยะใน C ++
Java มี GC อัตโนมัติที่จะหยุดชั่วขณะหนึ่ง แต่ดูแลขยะในกอง ขณะนี้แอปพลิเคชัน C / C ++ ไม่มีการหยุดทำงานแบบ STW เหล่านี้การใช้งานหน่วยความจำของพวกเขาจะไม่เพิ่มขึ้นอย่างไม่สิ้นสุด พฤติกรรมนี้สำเร็จได้อย่างไร วัตถุที่ตายแล้วได้รับการดูแลอย่างไร

5
ทำไมตัวชี้สมาร์ทที่มีการอ้างอิงจำนวนมากถึงได้รับความนิยม?
อย่างที่ฉันเห็นตัวชี้สมาร์ทถูกใช้อย่างกว้างขวางในโครงการ C ++ ในโลกแห่งความเป็นจริง แม้ว่าพอยน์เตอร์อัจฉริยะบางประเภทจะมีประโยชน์ในการสนับสนุน RAII และการถ่ายโอนความเป็นเจ้าของ แต่ก็มีแนวโน้มที่จะใช้พอยน์เตอร์ที่ใช้ร่วมกันตามค่าเริ่มต้นเป็นวิธีการ"เก็บขยะ"เพื่อให้โปรแกรมเมอร์ไม่ต้องคิดถึงการจัดสรรมาก . ทำไมตัวชี้ที่ใช้ร่วมกันรับความนิยมมากกว่าการบูรณาการเก็บขยะที่เหมาะสมเช่นBoehm GC ? (หรือคุณเห็นด้วยเลยว่ามันได้รับความนิยมมากกว่า GCs จริงหรือไม่) ฉันรู้เกี่ยวกับข้อดีสองประการของ GCs ทั่วไปมากกว่าการนับการอ้างอิง: ขั้นตอนวิธี GC ธรรมดาไม่มีปัญหากับการอ้างอิงรอบ การนับการอ้างอิงโดยทั่วไปจะช้ากว่า GC ที่เหมาะสม อะไรคือสาเหตุของการใช้ตัวชี้สมาร์ทนับการอ้างอิง?

7
เพราะเหตุใดจึงมีการสรุปขั้นสุดท้ายใน Java?
ตามโพสต์นี้เราไม่ควรพึ่งพาวิธีสุดท้ายที่จะเรียกว่า ดังนั้นทำไม Java จึงรวมไว้ในภาษาการเขียนโปรแกรมเลย? ดูเหมือนว่าการตัดสินใจที่จะรวมไว้ในภาษาการเขียนโปรแกรมใด ๆ ฟังก์ชั่นที่อาจได้รับการเรียก

8
ข้อเสียของการจัดการหน่วยความจำตามขอบเขต
ฉันชอบการจัดการหน่วยความจำตามขอบเขต (SBMM) หรือRAIIจริงๆแล้วเนื่องจากชุมชน C ++ เป็นที่รู้จักกันมากกว่าปกติ เท่าที่ฉันรู้ยกเว้น C ++ (และ C) ไม่มีภาษากระแสหลักอื่น ๆ ที่ใช้อยู่ในปัจจุบันซึ่งทำให้ SBMM / RAII เป็นกลไกการจัดการหน่วยความจำหลักและแทนที่จะต้องการใช้การรวบรวมขยะ (GC) ฉันพบว่ามันค่อนข้างสับสนตั้งแต่ SBMM ทำให้โปรแกรมกำหนดค่าได้มากขึ้น (คุณสามารถบอกได้อย่างแม่นยำเมื่อวัตถุถูกทำลาย) ในภาษาที่ใช้ GC คุณมักจะต้องทำการจัดการทรัพยากรด้วยตนเอง (ดูที่การปิดไฟล์ใน Java เช่น) ซึ่งบางส่วนเอาชนะวัตถุประสงค์ของ GC และยังมีข้อผิดพลาดเกิดขึ้นได้ง่าย หน่วยความจำฮีปสามารถ (ขอบเขตอย่างสวยงามมาก, imo) ได้เช่นกัน (ดูstd::shared_ptrใน C ++) ทำไม SBMM ถึงไม่ใช้กันอย่างแพร่หลาย? ข้อเสียของมันคืออะไร?

8
การเอาชนะ Object.finalize () ไม่ดีจริงเหรอ?
ข้อโต้แย้งหลักสองข้อต่อการยกเลิกObject.finalize()คือ: คุณไม่ต้องตัดสินใจเมื่อมันถูกเรียก มันอาจจะไม่ถูกเรียกเลย หากฉันเข้าใจสิ่งนี้อย่างถูกต้องฉันไม่คิดว่าสิ่งเหล่านี้เป็นเหตุผลที่ดีพอที่จะเกลียดObject.finalize()มาก มันขึ้นอยู่กับการนำ VM ไปใช้และ GC เพื่อพิจารณาว่าเวลาที่เหมาะสมในการจัดสรรคืนวัตถุนั้นไม่ใช่นักพัฒนา เหตุใดจึงสำคัญที่ต้องตัดสินใจเมื่อObject.finalize()ถูกเรียก ตามปกติและแก้ไขให้ถูกต้องหากฉันผิดเวลาที่Object.finalize()จะไม่ถูกเรียกก็คือเมื่อแอปพลิเคชันถูกยกเลิกก่อนที่ GC จะมีโอกาสเรียกใช้ อย่างไรก็ตามวัตถุได้ถูกจัดสรรคืนเมื่อกระบวนการของแอปพลิเคชันสิ้นสุดลง จึงObject.finalize()ไม่ได้รับการเรียกเนื่องจากไม่จำเป็นต้องโทร ทำไมนักพัฒนาถึงสนใจ? ทุกครั้งที่ฉันใช้วัตถุที่ฉันต้องปิดเอง (เช่นตัวจัดการไฟล์และการเชื่อมต่อ) ฉันจะผิดหวังมาก ฉันต้องตรวจสอบอย่างต่อเนื่องว่าวัตถุมีการนำไปใช้close()หรือไม่และฉันแน่ใจว่าฉันไม่ได้รับสายบางครั้งในอดีต ทำไมมันไม่ได้เป็นเพียงที่เรียบง่ายและปลอดภัยในการเพียงแค่ปล่อยให้มันไป VM และ GC ในการกำจัดของวัตถุเหล่านี้โดยการวางclose()การดำเนินงานในObject.finalize()?

3
ภาษาที่ใช้งานได้ทั้งหมดใช้การรวบรวมขยะหรือไม่
มีภาษาที่ใช้งานได้ซึ่งอนุญาตให้ใช้ความหมายของสแต็ก - การทำลายที่กำหนดขึ้นโดยอัตโนมัติเมื่อสิ้นสุดขอบเขตหรือไม่?

3
ยกเว้นตัวรวบรวมขยะสิ่งอื่นใดที่ทำให้ Java เป็นภาษาการเขียนโปรแกรมที่ไม่ใช่แบบเรียลไทม์
ยกเว้นตัวรวบรวมขยะคุณสมบัติอื่น ๆ ของ Java ที่ไม่เหมาะสมสำหรับการเขียนโปรแกรมแบบเรียลไทม์คืออะไร บนเน็ตทุกครั้งที่มีการพูดถึง Java vs C ++ เกี่ยวกับการเขียนโปรแกรมแบบเรียลไทม์มันจะเป็นตัวรวบรวมขยะที่กล่าวถึงเสมอ มีอะไรอีกไหม?

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.