ฉันไม่ได้อ่านหนังสือเกี่ยวกับ Java มานานแล้ว เมื่อเร็ว ๆ นี้ฉันได้อ่านภาษาการเขียนโปรแกรม << Java ของ James Gosling >> และจดบันทึกการอ่าน ส่วนนี้เกี่ยวกับการรีไซเคิลขยะ
1. การรีไซเคิลขยะ
วัตถุถูกสร้างขึ้นโดยใช้ใหม่ แต่ไม่มีการดำเนินการลบที่สอดคล้องกันเพื่อรีไซเคิลหน่วยความจำที่ครอบครองโดยวัตถุ เมื่อเราใช้วัตถุเสร็จเราก็ต้องหยุดการอ้างอิงไปยังวัตถุนั้น:
-> เปลี่ยนการอ้างอิงเป็นชี้ไปที่วัตถุอื่น
-> ชี้การอ้างอิงถึง null
-> กลับจากวิธีการเพื่อให้ตัวแปรท้องถิ่นของวิธีไม่มีอยู่อีกต่อไป
ประเด็นสำคัญ:
-> เมื่อเราไม่สามารถเข้าถึงวัตถุจากรหัสปฏิบัติการใด ๆ ได้พื้นที่ที่ใช้สามารถนำกลับมาใช้ใหม่ได้
-> การรีไซเคิลขยะหมายความว่าเราไม่ต้องกังวลเกี่ยวกับการอ้างอิงห้อย การอ้างอิงเท็จหมายถึงการอ้างอิงถึงพื้นที่หน่วยความจำที่ถูกลบ ปัญหานี้มีอยู่ในระบบที่โปรแกรมเมอร์สามารถควบคุมได้โดยตรงเมื่อลบวัตถุ
-> รุ่นตัวรวบรวมขยะ: วิธีการนับอ้างอิง (ไม่สามารถแก้ปัญหาการอ้างอิงแบบวงกลมได้), mark-and-sweep
2. สรุป
วิธีการขั้นสุดท้าย
-> หลังจากตัวสะสมขยะกำหนดว่าวัตถุนั้นไม่สามารถเข้าถึงได้และพื้นที่ของวัตถุจะถูกนำไปรีไซเคิลตัวเก็บขยะจะเรียกวิธีนี้
-> วิธีนี้สามารถล้างทรัพยากรที่ไม่ใช่หน่วยความจำทั้งหมดที่ใช้โดยวัตถุและสามารถเรียกได้เพียงครั้งเดียวสำหรับแต่ละวัตถุ แม้ว่าการดำเนินการของวิธีนี้จะทำให้วัตถุสามารถเข้าถึงได้อีกครั้งและจากนั้นจะไม่สามารถเข้าถึงได้อีกครั้ง แต่วิธีนี้สามารถเรียกได้เพียงครั้งเดียวเท่านั้น
วิธีการที่ -> สุดท้ายสามารถเรียกได้ในช่วงเวลาใดเวลาหนึ่งและอาจไม่ถูกเรียก (เครื่องเสมือน Java สิ้นสุดลง)
แทนที่วิธีการสรุป
-> เมื่อวัตถุกลายเป็นขยะวัตถุอื่น ๆ ที่อ้างถึงก็มีแนวโน้มที่จะกลายเป็นขยะ ขยะเหล่านี้อาจถูกยกเลิกก่อนที่จะเรียกวิธีการสุดท้ายที่เราเขียนดังนั้นพวกเขาอาจอยู่ในสถานะที่คาดเดาไม่ได้
-> เขียนทับวิธีการสรุปคือการเพิ่มวิธี super.finolize เป็นการดีที่สุดที่จะเพิ่มในประโยคสุดท้าย ตรวจสอบให้แน่ใจว่าเนื้อหาบางส่วนที่ประกาศไว้ในซูเปอร์คลาสของมันสามารถยกเลิกได้
iii. ชั้นเรียนและวิธีการที่เกี่ยวข้องสำหรับการโต้ตอบกับนักสะสมขยะ
คลาส: runtime.getRuntime (), ระบบ
วิธีการ: gc (), runfinalization (), freememory (), totalMemory (), maxmemory ()
คลาสระบบรองรับวิธีการคงที่ GC () และ runfinalization () ซึ่งจะเรียกวิธีการที่สอดคล้องกันในวัตถุรันไทม์ปัจจุบัน
iv. สถานะการเข้าถึงและวัตถุอ้างอิง
วัตถุสามารถเก็บขยะได้ก็ต่อเมื่อไม่มีการอ้างอิงระบุ แต่บางครั้งเราอาจต้องการรวบรวมวัตถุเป็นขยะเมื่อยังมีการอ้างอิงที่เลือกชี้ไปที่วัตถุ
วัตถุประสงค์เพียงอย่างเดียวของวัตถุอ้างอิงคือการอ้างอิงการอ้างอิงไปยังวัตถุอื่นที่เรียกว่าการอ้างอิง โดยปกติแล้วเราจะเก็บข้อมูลอ้างอิงไปยังวัตถุผ่านฟิลด์หรือตัวแปรท้องถิ่น แต่ตอนนี้เราสามารถรักษาข้อมูลอ้างอิงโดยตรงไปยังวัตถุอ้างอิงซึ่งห่อวัตถุที่เราต้องการจริง ตัวรวบรวมขยะอาจกำหนดว่าการอ้างอิงที่เหลือไปยังวัตถุนั้นถูกอ้างอิงไปยังวัตถุผ่านหน้าวัตถุอ้างอิงหรือไม่ดังนั้นจึงสามารถตัดสินใจได้ว่าจะรีไซเคิลวัตถุหรือไม่ ความแข็งแกร่งของวัตถุอ้างอิงจะกำหนดพฤติกรรมของตัวเก็บขยะและการอ้างอิงสามัญเป็นข้อมูลอ้างอิงที่ทรงพลังที่สุด
คลาสอ้างอิง
-> แพ็คเกจ: java.lang.ref
-> วิธีการทั่วไป: get (), clear (), enqueue (), isenqueued ()
การอ้างอิงและความแข็งแกร่งของการเข้าถึง
-> วัตถุสามารถเข้าถึงได้อย่างยิ่ง: การอ้างอิงทั่วไป
-> วัตถุสามารถเข้าถึงได้เบา ๆ : softreference
-> วัตถุที่สามารถเข้าถึงได้อย่างอ่อนแอ: อ่อนแอ
-> วัตถุสามารถเข้าถึงได้จริง (phantom reachable): phantomreference
-> วัตถุไม่สามารถเข้าถึงได้: ไม่มีลิงก์อ้างอิงเมื่อวัตถุสามารถเข้าถึงได้อย่างอ่อนแอ (หรือคอลัมน์อ่อนแอ) สามารถยกเลิกได้ หากวัตถุนั้นไม่สามารถเข้าถึงได้หลังจากการเลิกจ้างก็สามารถรีไซเคิลได้
เฟสการเข้าถึงวัตถุทำให้เกิดตัวเก็บขยะเพื่อดำเนินการพฤติกรรมที่เหมาะสมในประเภทวัตถุอ้างอิงที่เกี่ยวข้อง:
-> วัตถุที่เข้าถึงได้ง่ายอาจได้รับอนุญาตให้รีไซเคิลโดยนักสะสมขยะ สิ่งที่เรามั่นใจได้ก็คือการใช้ softreferences ทั้งหมดสำหรับวัตถุ softreference จะถูกล้างก่อนที่จะเกิดข้อผิดพลาด outofmemoryError
-> วัตถุที่เข้าถึงได้ดีจะถูกนำไปรีไซเคิลโดยนักสะสมขยะ
-> วัตถุที่เข้าถึงได้เสมือนไม่สามารถเข้าถึงได้อย่างแท้จริงเนื่องจากวัตถุอ้างอิงไม่สามารถเข้าถึงได้ผ่าน phantomreference และวิธีการรับของมันจะส่งคืนโมฆะเสมอ แต่การมีอยู่ของการอ้างอิงเสมือนจริงสามารถป้องกันไม่ให้วัตถุถูกรีไซเคิลก่อนที่จะล้างข้อมูลอ้างอิงเสมือนจริงอย่างชัดเจน การอ้างอิงเสมือนจริงช่วยให้เราสามารถจัดการกับวัตถุที่มีการเรียกใช้วิธีการสรุปทำให้ปลอดภัยที่จะคิดว่าพวกเขา "ตาย"