[แค่ต้องการเพิ่มเพิ่มเติมเกี่ยวกับกระบวนการ Internals of Finalization]
ดังนั้นคุณสร้างวัตถุและเมื่อรวบรวมวัตถุFinalize
วิธีการของวัตถุควรจะเรียกว่า แต่มีการสรุปมากกว่าสมมติฐานง่าย ๆ นี้
แนวคิดสั้น ::
วัตถุที่ไม่ได้ใช้Finalize
วิธีการนั้นจะมีการเรียกคืนหน่วยความจำทันทีเว้นแต่จะไม่สามารถเข้าถึงได้ด้วย
รหัสแอปพลิเคชันอีกต่อไป
วัตถุการใช้Finalize
วิธีการแนวคิด / การดำเนินงานของApplication Roots
, Finalization Queue
, Freacheable Queue
มาก่อนที่พวกเขาสามารถเรียกคืน
วัตถุใด ๆ ถือว่าเป็นขยะหากไม่สามารถเข้าถึงได้โดยรหัสแอปพลิเคชัน
สมมติว่า :: คลาส / วัตถุ A, B, D, G, H ไม่ใช้Finalize
วิธีการและ C, E, F, I, J ใช้Finalize
วิธีการ
เมื่อแอปพลิเคชันสร้างวัตถุใหม่ตัวดำเนินการใหม่จะจัดสรรหน่วยความจำจากฮีป ถ้าชนิดของวัตถุที่มีFinalize
วิธีการแล้วชี้ไปยังวัตถุที่วางอยู่ในคิวสรุป
ดังนั้นตัวชี้ไปยังวัตถุ C, E, F, I, J ได้รับการเพิ่มในคิวการสรุป คิวสรุปเป็นโครงสร้างข้อมูลภายในที่ควบคุมโดยการเก็บขยะ แต่ละรายการในคิวชี้ไปยังวัตถุที่ควรมีวิธีการที่เรียกว่าก่อนที่หน่วยความจำของวัตถุสามารถเรียกคืนได้ รูปด้านล่างแสดงฮีปที่มีหลายวัตถุ บางส่วนของวัตถุเหล่านี้สามารถเข้าถึงได้จากรากของแอปพลิเคชัน
Finalize
และบางคนไม่ เมื่อวัตถุ C, E, F, I, J และถูกสร้างขึ้นสุทธิตรวจกรอบที่วัตถุเหล่านี้มีFinalize
วิธีการและตัวชี้ไปยังวัตถุเหล่านี้จะถูกเพิ่มลงในคิวการสรุป
เมื่อ GC เกิดขึ้น (คอลเล็กชันที่ 1) วัตถุ B, E, G, H, I และ J ถูกกำหนดให้เป็นขยะ เนื่องจาก A, C, D, F ยังสามารถเข้าถึงได้โดยรหัสแอปพลิเคชันที่แสดงผ่านลูกศรจากกล่องสีเหลืองด้านบน
ตัวรวบรวมขยะจะสแกนคิวการสรุปสุดท้ายเพื่อค้นหาตัวชี้ไปยังวัตถุเหล่านี้ เมื่อพบตัวชี้ตัวชี้จะถูกลบออกจากคิวการสรุปสุดท้ายและต่อท้ายคิวที่สามารถเข้าถึงได้ ("เข้าถึงได้ F") คิว freachableเป็นโครงสร้างข้อมูลอื่นภายในการควบคุมโดยการเก็บขยะ ตัวชี้แต่ละตัวในคิวที่สามารถเข้าถึงได้ระบุวัตถุที่พร้อมที่จะมีวิธีการที่เรียกว่า
Finalize
หลังจากคอลเล็กชัน (คอลเล็กชันที่ 1) ฮีปที่ได้รับการจัดการมีลักษณะคล้ายกับรูปด้านล่าง คำอธิบายด้านล่าง ::
1. ) หน่วยความจำที่ครอบครองโดยวัตถุ B, G และ H ถูกเรียกคืนทันทีเนื่องจากวัตถุเหล่านี้ไม่มีวิธีการสรุปที่จำเป็นต้องเรียกใช้
2. ) อย่างไรก็ตามหน่วยความจำที่ครอบครองโดยวัตถุ E, I และ J ไม่สามารถเรียกคืนได้เนื่องจากFinalize
วิธีการของพวกเขายังไม่ได้เรียก
การเรียกเมธอด Finalize ทำได้โดยคิวที่น่าปวดหัว
3. ) A, C, D, F ยังคงเข้าถึงได้โดยรหัสแอปพลิเคชันที่แสดงผ่านลูกศรจากกล่องสีเหลืองด้านบนดังนั้นพวกเขาจะไม่ถูกรวบรวมในกรณีใด ๆ
มีเธรดรันไทม์พิเศษที่ทุ่มเทให้กับการเรียกวิธีการสุดท้าย เมื่อคิวที่สามารถเข้าถึงได้ว่างเปล่า (ซึ่งโดยปกติจะเป็นกรณี) เธรดนี้จะพัก แต่เมื่อรายการปรากฏขึ้นเธรดนี้จะเอาออกแต่ละรายการออกจากคิวและเรียกวิธีการสุดท้ายของแต่ละวัตถุ ตัวรวบรวมขยะจะบีบอัดหน่วยความจำที่สามารถเรียกคืนได้และเธรดรันไทม์พิเศษจะทำการล้างคิวที่สามารถเข้าถึงได้ดำเนินการFinalize
วิธีการของแต่ละวัตถุ ดังนั้นที่นี่ในที่สุดก็คือเมื่อวิธีสุดท้ายของคุณได้รับการดำเนินการ
ครั้งต่อไปที่ตัวรวบรวมขยะถูกเรียกใช้ (ชุดที่ 2) จะเห็นว่าวัตถุที่สรุปแล้วเป็นขยะจริงเนื่องจากรากของแอปพลิเคชันไม่ได้ชี้ไปที่มันและคิวที่สามารถเข้าถึงได้จะไม่ชี้ไปที่มันอีกต่อไป หน่วยความจำสำหรับวัตถุ (E, I, J) เป็นเพียงการเรียกคืนจากกองดูรูปด้านล่างและเปรียบเทียบกับรูปด้านบน
สิ่งสำคัญที่ต้องเข้าใจว่านี่คือสอง GCs จะต้องเรียกคืนหน่วยความจำที่ใช้โดยวัตถุที่จำเป็นต้องมีการสรุป ในความเป็นจริงจะต้องมีคอลเลกชันรถแท็กซี่มากกว่าสองคันเนื่องจากวัตถุเหล่านี้อาจได้รับการเลื่อนระดับเป็นรุ่นเก่ากว่า
หมายเหตุ :: คิว freachableถือว่าเป็นรากเช่นเดียวกับตัวแปรทั่วโลกและแบบคงที่ราก ดังนั้นถ้าวัตถุอยู่ในคิวที่สามารถเข้าถึงได้ดังนั้นวัตถุนั้นสามารถเข้าถึงได้และไม่ใช่ขยะ
โปรดทราบว่าเมื่อใช้แอปพลิเคชั่นการดีบักเป็นสิ่งหนึ่ง Garbage Collection เป็นอีกสิ่งหนึ่งและทำงานต่างออกไป จนถึงตอนนี้คุณไม่สามารถ FEEL คอลเลกชันขยะเพียงแค่ทำการดีบั๊กแอปพลิเคชันต่อไปหากคุณต้องการตรวจสอบหน่วยความจำเริ่มต้นที่นี่