AFAIK ข้อมูลจำเพาะ JVM (เขียนเป็นภาษาอังกฤษ) ไม่ได้กล่าวถึงเมื่อควรลบวัตถุ (หรือค่า) อย่างแน่นอนและปล่อยให้การนำไปใช้ (เช่นเดียวกันสำหรับR5RS ) อย่างใดมันต้องหรือแนะนำตัวเก็บขยะแต่ออกจากรายละเอียดเพื่อการดำเนินการ และเช่นเดียวกันสำหรับข้อกำหนดของ Java
โปรดจำไว้ว่าการเขียนโปรแกรมภาษาที่มีรายละเอียด (จากไวยากรณ์ , ความหมาย , ฯลฯ ... ), ไม่ได้ใช้งานซอฟต์แวร์ ภาษาอย่าง Java (หรือ JVM) มีการนำไปใช้งานหลายอย่าง สเปคของมันถูกตีพิมพ์ , ดาวน์โหลด (เพื่อให้คุณสามารถเรียนได้) และเขียนเป็นภาษาอังกฤษ §2.5.3กองข้อมูลจำเพาะของ JVM กล่าวถึงตัวรวบรวมขยะ:
ที่จัดเก็บฮีปสำหรับออบเจ็กต์ได้รับการเรียกคืนโดยระบบการจัดการที่จัดเก็บอัตโนมัติ วัตถุจะไม่ถูกยกเลิกการจัดสรรอย่างชัดเจน Java Virtual Machine ไม่มีระบบจัดการหน่วยเก็บข้อมูลอัตโนมัติประเภทใดเป็นพิเศษ
(การเน้นคือของฉัน; การสรุป BTW ถูกกล่าวถึงใน§12.6ของข้อมูลจำเพาะ Java และรุ่นของหน่วยความจำอยู่ในin17.4ของข้อมูลจำเพาะของ Java)
ดังนั้น (ชวา) คุณไม่ควรดูแลเมื่อวัตถุถูกลบและคุณสามารถใช้รหัสเป็นถ้ามันไม่ได้เกิดขึ้น (โดยให้เหตุผลในสิ่งที่เป็นนามธรรมที่คุณไม่สนใจว่า) แน่นอนคุณต้องใส่ใจเกี่ยวกับการใช้หน่วยความจำและชุดของสิ่งมีชีวิตซึ่งเป็นคำถามที่แตกต่างกัน ในหลายกรณี (คิดว่าเป็นโปรแกรม "สวัสดีโลก") คุณสามารถพิสูจน์หรือโน้มน้าวตัวเองว่าหน่วยความจำที่จัดสรรมีขนาดค่อนข้างเล็ก (เช่นน้อยกว่ากิกะไบต์) และคุณไม่สนใจเลย การลบแต่ละวัตถุ ในกรณีอื่น ๆ คุณสามารถโน้มน้าวตัวเองว่าสิ่งมีชีวิต(หรือสิ่งที่เข้าถึงได้ซึ่งเป็น superset - ง่ายกว่าที่จะให้เหตุผลเกี่ยวกับชีวิต) ไม่เกินขีด จำกัด ที่สมเหตุสมผล (และจากนั้นคุณต้องพึ่งพา GC แต่คุณไม่สนใจว่าจะเกิดการเก็บขยะอย่างไรและเมื่อใด) อ่านข้อมูลเกี่ยวกับความซับซ้อนของพื้นที่
ฉันเดาว่าในการใช้งานJVMหลายครั้งที่รันโปรแกรม Java อายุสั้นเช่นสวัสดีชาวโลกตัวเก็บรวบรวมขยะจะไม่ถูกเรียกใช้เลยและไม่มีการลบเกิดขึ้น AFAIU พฤติกรรมดังกล่าวสอดคล้องกับข้อกำหนด Java จำนวนมาก
การใช้งาน JVM ส่วนใหญ่ใช้เทคนิคการคัดลอกgenerational (อย่างน้อยสำหรับวัตถุ Java ส่วนใหญ่ที่ไม่ได้ใช้การสรุปหรือการอ้างอิงที่อ่อนแอและการสรุปไม่รับประกันว่าจะเกิดขึ้นในเวลาอันสั้นและอาจถูกเลื่อนออกไป ขึ้นอยู่กับมาก) ซึ่งความคิดของการลบวัตถุแต่ละรายการไม่ได้ทำให้รู้สึกใด ๆ (ตั้งแต่บล็อกขนาดใหญ่ของหน่วยความจำ - โซนหน่วยความจำที่ควบคุมสำหรับวัตถุจำนวนมาก - บางทีหลายเมกะไบต์ในครั้งเดียวได้รับการปล่อยตัวในครั้งเดียว)
หากข้อกำหนด JVM ต้องการให้ลบแต่ละวัตถุออกโดยเร็วที่สุด (หรือเพิ่มข้อ จำกัด ในการลบวัตถุ) เทคนิคการสร้าง generational GC ที่มีประสิทธิภาพจะถูกห้ามและผู้ออกแบบ Java และ JVM นั้นฉลาดในการหลีกเลี่ยงสิ่งนั้น
BTW อาจเป็นไปได้ว่า JVM ไร้เดียงสาที่ไม่เคยลบวัตถุและไม่ปล่อยหน่วยความจำอาจเป็นไปตามข้อกำหนด (ตัวอักษรไม่ใช่จิตวิญญาณ) และแน่นอนสามารถใช้สิ่งสวัสดีโลกในทางปฏิบัติ (สังเกตว่าส่วนใหญ่ โปรแกรม Java อายุสั้นและขนาดเล็กอาจไม่จัดสรรหน่วยความจำเกินกว่าสองสามกิกะไบต์) แน่นอนเช่น JVM จะไม่คุ้มค่าการกล่าวขวัญและเป็นเพียงสิ่งที่ของเล่น (เหมือนนี้การดำเนินการmalloc
สำหรับ C) ดูEpsilon NoOp GCสำหรับข้อมูลเพิ่มเติม JVMs ในชีวิตจริงเป็นซอฟต์แวร์ที่ซับซ้อนมากและผสมผสานเทคนิคการรวบรวมขยะจำนวนมาก
นอกจากนี้Javaไม่เหมือนกับ JVM และคุณมีการนำ Java ไปใช้โดยไม่มี JVM (เช่นJava compilers ล่วงหน้า , รันไทม์ Android ) ในบางกรณี (ส่วนใหญ่เป็นนักวิชาการ) คุณอาจจินตนาการ (เรียกว่าเทคนิค "การรวบรวมเวลารวบรวมขยะ") ที่โปรแกรม Java ไม่ได้จัดสรรหรือลบที่รันไทม์ (เช่นเนื่องจากคอมไพเลอร์เพิ่มประสิทธิภาพได้ฉลาดพอที่จะใช้call stackและตัวแปรอัตโนมัติ )
เหตุใดจึงไม่ลบวัตถุ Java ทันทีหลังจากที่ไม่มีการอ้างอิงอีกต่อไป
เนื่องจากข้อกำหนดของ Java และ JVM ไม่ต้องการสิ่งนั้น
อ่านคู่มือ GCสำหรับข้อมูลเพิ่มเติม (และข้อกำหนดJVM ) ขอให้สังเกตว่าการมีชีวิตอยู่ (หรือมีประโยชน์ต่อการคำนวณในอนาคต) สำหรับวัตถุนั้นเป็นคุณสมบัติทั้งโปรแกรม (ไม่ใช่แบบแยกส่วน)
Objective-Cโปรดปรานอ้างอิงนับแนวทางการจัดการหน่วยความจำ และนั่นก็มีข้อผิดพลาด (เช่นโปรแกรมเมอร์ Objective-C ต้องดูแลเกี่ยวกับการอ้างอิงแบบวงกลมโดยการอธิบายการอ้างอิงที่อ่อนแอ แต่ JVM จัดการการอ้างอิงแบบวงกลมเป็นอย่างดีในทางปฏิบัติโดยไม่ต้องการความสนใจจากโปรแกรมเมอร์ Java)
นอกจากนี้ไม่มีกระสุนเงินในการเขียนโปรแกรมและการออกแบบการเขียนโปรแกรมภาษา (จะตระหนักถึงปัญหาลังเล ; เป็นวัตถุที่อยู่อาศัยที่มีประโยชน์คือundecidableทั่วไป)
นอกจากนี้คุณยังอาจจะอ่านSICP , การเขียนโปรแกรมภาษาเน้นที่มังกรหนังสือ , เสียงกระเพื่อมในชิ้นเล็ก ๆและระบบปฏิบัติการ: สามชิ้นง่าย พวกเขาไม่ได้เกี่ยวกับ Java แต่พวกเขาจะเปิดใจของคุณและควรช่วยให้เข้าใจสิ่งที่ JVM ควรทำและวิธีการใช้งานจริง (กับชิ้นส่วนอื่น ๆ ) ในคอมพิวเตอร์ของคุณ คุณสามารถใช้เวลาหลายเดือน (หรือหลายปี) ในการศึกษาซอร์สโค้ดที่ซับซ้อนของการใช้งาน JVM แบบโอเพ่นซอร์สที่มีอยู่(เช่นOpenJDKซึ่งมีซอร์สโค้ดหลายล้านเส้น)