นี่เป็นคำถามที่น่ารำคาญอย่างมากและฉันรู้สึกว่ามีส่วนช่วยในการต่อต้าน Java มากแม้ว่าจะมีประโยชน์ในการใช้ภาษา
ความจริงที่ว่าคุณไม่สามารถไว้วางใจ "System.gc" ในการทำอะไรได้อย่างไม่น่าเชื่อและสามารถเรียกใช้ "ความกลัว, ความไม่แน่นอน, ข้อสงสัย" ได้อย่างง่ายดาย
ในหลายกรณีมันเป็นการดีที่จะจัดการกับหนามหน่วยความจำที่คุณทำให้เกิดขึ้นก่อนที่จะเกิดเหตุการณ์สำคัญซึ่งจะทำให้ผู้ใช้คิดว่าโปรแกรมของคุณได้รับการออกแบบ / ไม่ตอบสนอง
การมีความสามารถในการควบคุมการรวบรวมขยะจะเป็นเครื่องมือการศึกษาที่ยอดเยี่ยมในการปรับปรุงความเข้าใจของผู้คนเกี่ยวกับวิธีการทำงานของการรวบรวมขยะและวิธีการทำให้โปรแกรมใช้ประโยชน์จากพฤติกรรมเริ่มต้นเช่นเดียวกับพฤติกรรมที่ควบคุม
ให้ฉันตรวจสอบข้อโต้แย้งของหัวข้อนี้
- มันไม่มีประสิทธิภาพ:
บ่อยครั้งที่โปรแกรมอาจไม่ทำอะไรเลยและคุณรู้ว่ามันไม่ได้ทำอะไรเพราะวิธีการออกแบบ ตัวอย่างเช่นอาจใช้เวลารอนานกับกล่องข้อความรอขนาดใหญ่และท้ายที่สุดอาจเพิ่มการเรียกเพื่อรวบรวมขยะเพราะเวลาในการเรียกใช้จะใช้เวลาเพียงเล็กน้อยเท่านั้น รอนาน แต่จะหลีกเลี่ยง gc จากการแสดงในระหว่างการดำเนินการที่สำคัญกว่า
- เป็นแนวปฏิบัติที่ไม่ดีเสมอและระบุรหัสที่ใช้ไม่ได้
ฉันไม่เห็นด้วยไม่สำคัญว่าคุณมีคนเก็บขยะ หน้าที่ของมันคือการติดตามขยะและทำความสะอาด
โดยการเรียก gc ในช่วงเวลาที่การใช้งานมีความสำคัญน้อยลงคุณจะลดอัตราต่อรองที่จะทำงานเมื่อชีวิตของคุณต้องอาศัยรหัสเฉพาะที่กำลังทำงานอยู่ แต่จะตัดสินใจเก็บขยะแทน
แน่นอนว่ามันอาจไม่ทำงานตามที่คุณต้องการหรือคาดหวัง แต่เมื่อคุณต้องการโทรหาคุณจะรู้ว่าไม่มีอะไรเกิดขึ้นและผู้ใช้ยินดีที่จะทนต่อความเชื่องช้า / การหยุดทำงาน ถ้า System.gc ใช้งานได้ดีมาก! หากไม่เป็นเช่นนั้นอย่างน้อยคุณก็ลอง ไม่มีข้อเสียเลยเว้นแต่ตัวรวบรวมขยะจะมีผลข้างเคียงโดยธรรมชาติที่ทำสิ่งที่ไม่คาดคิดอย่างน่ากลัวว่าตัวเก็บขยะนั้นควรทำตัวอย่างไรหากเรียกใช้ด้วยตนเองและสิ่งนี้เองทำให้เกิดความไม่ไว้วางใจ
- มันไม่ใช่กรณีการใช้งานทั่วไป:
มันเป็นกรณีการใช้งานที่ไม่สามารถทำได้อย่างน่าเชื่อถือ แต่อาจเป็นได้ว่าระบบได้รับการออกแบบด้วยวิธีนี้หรือไม่ มันเหมือนกับการสร้างสัญญาณไฟจราจรและทำให้ปุ่มบางตัว / ทั้งหมดของสัญญาณไฟจราจรไม่ทำอะไรเลยมันทำให้คุณถามว่าทำไมถึงมีปุ่มขึ้นต้นด้วย javascript ไม่มีฟังก์ชั่นเก็บขยะ กลั่นกรองมันมากสำหรับมัน
- ข้อมูลจำเพาะระบุว่า System.gc () เป็นคำใบ้ที่ GC ควรรันและ VM มีอิสระที่จะเพิกเฉยได้
"คำใบ้" คืออะไร? "เพิกเฉย" คืออะไร คอมพิวเตอร์ไม่สามารถใช้คำใบ้หรือเพิกเฉยบางสิ่งได้มีเส้นทางพฤติกรรมที่เข้มงวดซึ่งอาจเป็นแบบไดนามิกที่ถูกชี้นำโดยเจตนาของระบบ คำตอบที่เหมาะสมจะรวมถึงสิ่งที่ตัวรวบรวมขยะกำลังทำอยู่ในระดับการนำไปใช้จริงซึ่งทำให้ไม่สามารถรวบรวมข้อมูลได้เมื่อคุณร้องขอ คุณลักษณะนี้เป็นเพียงแค่ nop หรือไม่? มีเงื่อนไขอะไรบ้างที่ฉันต้องเจอ? เงื่อนไขเหล่านี้คืออะไร?
เมื่อพูดถึง GC ของ Java มักจะดูเหมือนสัตว์ประหลาดที่คุณไม่ไว้ใจ คุณไม่รู้ว่ามันกำลังจะมาหรือไปคุณไม่รู้ว่ามันกำลังจะทำอะไรมันจะทำยังไง ฉันสามารถจินตนาการได้ว่าผู้เชี่ยวชาญบางคนมีความคิดที่ดีกว่าว่า Garbage Collection ของพวกเขาทำงานอย่างไรตามคำสั่ง แต่ส่วนใหญ่ก็หวังว่ามันจะ "ได้ผล" และต้องเชื่อใจอัลกอริธึมที่ดูเหมือนทึบแสงในการทำงานให้คุณ
มีช่องว่างขนาดใหญ่ระหว่างการอ่านเกี่ยวกับบางสิ่งบางอย่างหรือกำลังสอนอะไรบางอย่างและเห็นการใช้งานจริงความแตกต่างระหว่างระบบต่าง ๆ และสามารถเล่นกับมันได้โดยไม่ต้องดูซอร์สโค้ด สิ่งนี้สร้างความมั่นใจและความรู้สึกของผู้เชี่ยวชาญ / ความเข้าใจ / การควบคุม
เพื่อสรุปมีปัญหาโดยธรรมชาติกับคำตอบ "คุณสมบัตินี้อาจไม่ทำอะไรเลยและฉันจะไม่ลงรายละเอียดวิธีบอกเมื่อมันทำอะไรบางอย่างและเมื่อมันไม่ได้และทำไมมันจะไม่หรือจะ มักจะหมายความว่ามันเป็นการขัดกับปรัชญาที่จะพยายามทำมันแม้ว่าเจตนาที่อยู่เบื้องหลังนั้นสมเหตุสมผล "
มันอาจจะไม่เป็นไรที่ Java GC จะทำงานในแบบที่มันทำหรืออาจจะไม่ใช่ แต่ถ้าจะเข้าใจมันเป็นการยากที่จะทำตามอย่างแท้จริงในทิศทางที่จะไปรับภาพรวมที่ครอบคลุมของสิ่งที่คุณสามารถไว้วางใจ GC ให้ทำ ไม่ต้องทำดังนั้นมันง่ายเกินไปที่จะเชื่อใจภาษาเพราะจุดประสงค์ของภาษาคือการควบคุมพฤติกรรมในระดับปรัชญา (เป็นเรื่องง่ายสำหรับโปรแกรมเมอร์โดยเฉพาะอย่างยิ่งผู้ฝึกหัดโดยเฉพาะอย่างยิ่งผู้ฝึกหัดที่ตกอยู่ในภาวะวิกฤติจากพฤติกรรมของระบบ / ภาษา) มีความสามารถในการทน (และถ้าคุณไม่สามารถคุณจะไม่ใช้ภาษาจนกว่าคุณจะต้อง) และสิ่งอื่น ๆ ที่คุณไม่สามารถควบคุมได้โดยไม่รู้เหตุผลว่าทำไมคุณไม่สามารถควบคุมพวกเขาเป็นอันตรายโดยเนื้อแท้