แนวคิดของการอ้างอิงที่แข็งแกร่งการอ้างอิงที่อ่อนนุ่มการอ้างอิงที่อ่อนแอและการอ้างอิงเสมือนจริง
การอ้างอิงที่รุนแรง
ใบเสนอราคาที่แข็งแกร่งอ้างถึงใบเสนอราคาทั่วไปในรหัสโปรแกรม ตัวอย่างเช่นวัตถุและ STR ในรหัสต่อไปนี้เป็นทั้งใบเสนอราคาที่แข็งแกร่ง:
วัตถุวัตถุ = วัตถุใหม่ (); string str = "สวัสดี";
ตราบใดที่วัตถุมีการอ้างอิงที่แข็งแกร่งที่เกี่ยวข้อง JVM จะไม่รีไซเคิลวัตถุนี้อย่างแน่นอน แม้ในกรณีที่ไม่มีหน่วยความจำ JVM ก็ค่อนข้างจะโยนข้อผิดพลาด outofmemory มากกว่ารีไซเคิลวัตถุดังกล่าว
ตัวอย่างเช่นรหัสต่อไปนี้:
คลาสสาธารณะหลัก {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {new main (). fun1 (); } โมฆะสาธารณะ fun1 () {object object = new Object (); วัตถุ [] objarr = วัตถุใหม่ [1000]; -เมื่อวิ่งไปที่วัตถุ [] objarr = วัตถุใหม่ [1000]; เมื่อวิ่งไปที่ประโยคนี้หากมีหน่วยความจำไม่เพียงพอ JVM จะโยนข้อผิดพลาดของ OOM และจะไม่รีไซเคิลวัตถุที่ชี้ไปที่วัตถุ อย่างไรก็ตามควรสังเกตว่าหลังจาก Fun1 ทำงานทั้งวัตถุและ Objarr ไม่มีอยู่อีกต่อไปดังนั้นวัตถุที่พวกเขาชี้ไปจะถูกรีไซเคิลโดย JVM
หากคุณต้องการขัดจังหวะการเชื่อมโยงระหว่างการอ้างอิงที่แข็งแกร่งและวัตถุคุณสามารถแสดงการอ้างอิงถึง null เพื่อให้ JVM จะรีไซเคิลวัตถุในเวลาที่เหมาะสม
การประนีประนอม
การอ้างอิงที่อ่อนนุ่มใช้เพื่ออธิบายวัตถุที่มีประโยชน์ แต่ไม่จำเป็นและไม่จำเป็นต้องแสดงใน Java โดยใช้คลาส java.lang.ref.softreference สำหรับวัตถุที่เกี่ยวข้องกับการอ้างอิงที่เกี่ยวข้อง JVM จะรีไซเคิลวัตถุเฉพาะเมื่อมีหน่วยความจำไม่เพียงพอ ดังนั้นสิ่งนี้สามารถใช้งานได้ดีในการแก้ปัญหาของ OOM และคุณสมบัตินี้เหมาะมากสำหรับการใช้การแคช: เช่นการแคชเว็บเพจการแคชรูปภาพ ฯลฯ
การอ้างอิงที่อ่อนนุ่มสามารถใช้ร่วมกับคิวอ้างอิง (อ้างอิง) หากวัตถุที่อ้างอิงโดยการอ้างอิงแบบซอฟต์ถูกนำกลับมาใช้ใหม่โดย JVM การอ้างอิงที่อ่อนนุ่มจะถูกเพิ่มเข้าไปในคิวอ้างอิงที่เกี่ยวข้อง นี่คือตัวอย่างของการใช้งาน:
นำเข้า java.lang.ref.weakreference; คลาสสาธารณะหลัก {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {beakreference <string> sr = new beakreference <string> (สตริงใหม่ ("hello")); System.out.println (sr.get ()); System.gc (); // แจ้ง GC ของ JVM สำหรับ System.Out.out.println (Sr.Get ()); -ความอ่อนแอ
การอ้างอิงที่อ่อนแอยังใช้เพื่ออธิบายวัตถุที่ไม่จำเป็น เมื่อ JVM ดำเนินการรวบรวมขยะวัตถุที่เกี่ยวข้องกับการอ้างอิงที่อ่อนแอจะถูกนำกลับมาใช้ใหม่โดยไม่คำนึงว่าหน่วยความจำเพียงพอหรือไม่ ใน Java ให้ใช้คลาส java.lang.ref.weakreference เพื่อเป็นตัวแทน นี่คือตัวอย่างของการใช้งาน:
นำเข้า java.lang.ref.weakreference; คลาสสาธารณะหลัก {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {beakreference <string> sr = new beakreference <string> (สตริงใหม่ ("hello")); System.out.println (sr.get ()); System.gc (); // แจ้ง GC ของ JVM สำหรับ System.Out.out.println (Sr.Get ()); -การอ้างสิทธิ์
การอ้างอิงเสมือนจริงนั้นแตกต่างจากการอ้างอิงที่อ่อนนุ่มก่อนหน้านี้และการอ้างอิงที่อ่อนแอและไม่ส่งผลกระทบต่อวงจรชีวิตของวัตถุ ใน Java ใช้ Java.lang.ref.phantomreference คลาสเพื่อเป็นตัวแทน หากวัตถุเกี่ยวข้องกับการอ้างอิงเสมือนจริงอาจถูกรีไซเคิลโดยนักสะสมขยะได้ตลอดเวลาเช่นเดียวกับการอ้างอิงที่ไม่เกี่ยวข้องกับมัน
ควรสังเกตว่าต้องใช้การอ้างอิงเสมือนจริงในการเชื่อมโยงกับคิวอ้างอิง เมื่อตัวเก็บขยะกำลังเตรียมที่จะรีไซเคิลวัตถุหากพบว่ามีการอ้างอิงเสมือนจริงมันจะเพิ่มการอ้างอิงเสมือนจริงนี้ในคิวอ้างอิงที่เกี่ยวข้อง โปรแกรมสามารถเข้าใจได้ว่าวัตถุที่อ้างอิงจะถูกเก็บรวบรวมโดยการตัดสินว่ามีการเพิ่มการอ้างอิงเสมือนจริงในคิวอ้างอิงหรือไม่ หากโปรแกรมพบว่ามีการเพิ่มการอ้างอิงเสมือนจริงลงในคิวอ้างอิงอาจดำเนินการที่จำเป็นก่อนที่หน่วยความจำของวัตถุที่อ้างอิงจะถูกนำกลับมาใช้ใหม่
ความเข้าใจเพิ่มเติมเกี่ยวกับการอ้างอิงที่อ่อนนุ่มและอ่อนแอ
เรามักจะใช้การอ้างอิงที่แข็งแกร่งเมื่อเขียนโค้ด สำหรับการอ้างอิงอีกสามประเภทที่ใช้กันมากที่สุดคือการอ้างอิงที่อ่อนนุ่มและการอ้างอิงที่อ่อนแอ ทั้งสองนี้มีทั้งความคล้ายคลึงและความแตกต่าง พวกมันทั้งหมดใช้เพื่ออธิบายวัตถุที่ไม่จำเป็น แต่วัตถุที่เกี่ยวข้องกับการอ้างอิงที่อ่อนนุ่มจะถูกนำกลับมาใช้ใหม่เมื่อมีหน่วยความจำไม่เพียงพอในขณะที่วัตถุที่เกี่ยวข้องกับการอ้างอิงที่อ่อนแอจะถูกนำกลับมาใช้ใหม่เสมอเมื่อ JVM ถูกเก็บรวบรวมขยะ ในมุมมองของคุณสมบัติข้างต้นการอ้างอิงที่อ่อนนุ่มเหมาะสำหรับการแคช เมื่อหน่วยความจำไม่เพียงพอ JVM สามารถรีไซเคิลหน่วยความจำ การอ้างอิงที่อ่อนแอสามารถใช้เพื่อป้องกันการรั่วไหลของหน่วยความจำในฟังก์ชั่นการโทรกลับ เนื่องจากฟังก์ชั่นการโทรกลับมักจะเป็นคลาสภายในที่ไม่ระบุชื่อและบันทึกการอ้างอิงไปยังคลาสภายนอกโดยปริยายหากฟังก์ชั่นการโทรกลับถูกเรียกกลับในเธรดอื่นและหากคลาสภายนอกจำเป็นต้องรีไซเคิลในเวลานี้
บทความข้างต้นพูดสั้น ๆ เกี่ยวกับความแตกต่างระหว่างวิธีการอ้างอิงสี่วิธีใน Java เป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น