JavaRush /בלוג Java /Random-HE /הבדלים בין הפניות חלשות, רכות, פאנטום ורגילות בג'אווה
theGrass
רָמָה
Саратов

הבדלים בין הפניות חלשות, רכות, פאנטום ורגילות בג'אווה

פורסם בקבוצה
הפניות "חלשות" והפניות "רכות" (WeakReference, SoftReference) נוספו ל- Java API לפני זמן רב, אך לא כל מתכנת מכיר אותם. זה מצביע על פער בהבנה היכן וכיצד להשתמש בהם. שיעורי ייחוס חשובים במיוחד בהקשר של איסוף אשפה . כפי שכולנו יודעים, אוסף האשפה משחרר בעצמו את הזיכרון שנכבש על ידי אובייקטים, אך לא כל המתכנתים יודעים שהוא מקבל את ההחלטה לשחרר זיכרון על סמך סוג ההפניות הזמינות לאובייקט. הבדלים בין הפניות חלשות, רכות, פאנטום ורגילות ב-Java - 1ההבדל העיקרי בין SoftReference ל- WeakReference הוא איך האספן יעבוד איתם. הוא יכול למחוק אובייקט בכל עת אם רק קישורים חלשים מצביעים עליו, מצד שני, אובייקטים עם קישור רך יאספו רק כאשר ה-JVM באמת צריך זיכרון. בשל תכונות אלה של כיתות התייחסות, לכל אחת מהן יש שימוש משלה. ניתן להשתמש ב-SoftReference ליישום מטמונים וכאשר ה-JVM זקוק לזיכרון הוא ישחרר אותו על ידי מחיקת אובייקטים כאלה. ו- WeakReferences נהדרות לאחסון מטא נתונים, למשל, אחסון קישור ל-ClassLoader. אם אין מחלקות לטעון אז אין טעם לאחסן הפניה ל- ClassLoader , הפניה חלשה הופכת את ה-ClassLoader לזמין להסרה ברגע שנקצה אותו במקום רפרנס Strong. במאמר זה נבחן את ההבדלים בין סוגי קישורים, כולל הפניה חזקה והפניה לפנטום .

WeakReference לעומת SoftReference ב-Java

למי שלא יודע, ישנם 4 סוגי קישורים:
  1. התייחסות חזקה
  2. התייחסות חלשה
  3. התייחסות רכה
  4. הפניה לפנטום
הקישור החזק הוא הפשוט ביותר, מכיוון שאנו משתמשים בו בתכנות כל יום, למשל, בקוד כמו String s = "abc" המשתנה s הוא הקישור החזק. כל חפץ שיש לו התייחסות חזקה אסור לפינוי על ידי אוסף האשפה. כמובן, אלו אובייקטים שתוכנית Java צריכה. הפניות חלשות מיוצגות על ידי המחלקה java.lang.ref.WeakReference , אתה יכול להגדיר הפניה חלשה כך:
Counter counter = new Counter(); // strong reference
WeakReference weakCounter = new WeakReference(counter); //weak reference
counter = null; // now Counter object is eligible for garbage collection
כעת, ברגע שאתה מגדיר את מונה ההתייחסות החזקה ל- null (מונה = null), האובייקט שנוצר בשורה הראשונה הופך לזמין לאיסוף אשפה מכיוון שאין לו עוד התייחסות חזקה. הפניה של WeakCounter שנוצרה על ידי Weak אינה יכולה למנוע מהאספן למחוק את אובייקט ה-Counter. מצד שני, אם זה היה רפרנס Soft, אובייקט ה-Counter לא היה נמחק עד של- JVM יהיה צורך גבוה במיוחד בזיכרון. הפניות רכות ב- Java מיוצגות על ידי המחלקה java.lang.ref.SoftReference . דוגמה ליצירת SoftReference ב- Java
Counter prime = new Counter();  // prime holds a strong reference
SoftReference soft = new SoftReference(prime) ; //soft reference variable has SoftReference to Counter Object
prime = null;  // now Counter object is eligible for garbage collection but only be collected when JVM absolutely needs memory
לאחר ניקוי הפניה החזקה (בשורה ה-3), תישאר רק הפניה רכה אחת על אובייקט ה-Counter, מה שלא יוכל למנוע מהאספן למחוק את האובייקט הזה, אך בניגוד להפניה חלשה, הוא יוכל לדחות את התהליך הזה עד שיהיה מחסור חריף בזיכרון. בהתחשב בהבדל הזה בין קישורים רכים לקישורים חלשים, הראשון מתאים יותר למטמונים וחלש למטא נתונים. דוגמה טובה היא המחלקה WeakHashMap, שהיא צאצא של ממשק Map כמו מחלקות HashMap או TreeMap , אבל עם תכונה ייחודית אחת. WeakHashMap עוטפת מפתחות כהפניות חלשות, מה שאומר שברגע שאין הפניות חזקות לאובייקט, הפניות חלשות שנמצאות בתוך WeakHashMap לא יצילו אתכם מאוספן האשפה. קישורי פנטום הם הסוג השלישי של קישורים הזמינים בחבילת java.lang.ref. הפניות לפנטום מיוצגות על ידי המחלקה java.lang.ref.PhantomReference . אובייקט שאליו הצביע רק על ידי קישורי פנטום יכול להימחק על ידי האספן בכל עת. קישור פנטום נוצר באותו אופן כמו קישור חלש או רך.
DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference
PhantomReference phantom = new PhantomReference(digit); // phantom reference
digit = null;
ברגע שתנקה את ההפניות החזקות לאובייקט DigitalCounter, אוסף האשפה ימחק אותו בכל עת, שכן כעת רק הפניות פנטום מצביעות עליו. בנוסף למחלקות WeakReference, SoftReference, PhantomReference, WeakHashMap, כדאי לדעת על המחלקה ReferenceQueue . אתה יכול להשתמש במחלקה זו בעת יצירת אובייקט WeakReference, SoftReference או PhantomReference:
ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup
DigitalCounter digit = new DigitalCounter();
PhantomReference phantom = new PhantomReference(digit, refQueue);
הפניה לאובייקט תתווסף ל- ReferenceQueue ותוכל לנטר את מצב ההפניות על-ידי סקר את ReferenceQueue. מחזור החיים של אובייקט מיוצג היטב בתרשים הזה: הבדלים בין הפניות חלשות, רכות, פאנטום ורגילות בג'אווה - 2זה כל ההבדלים בין הפניות חלשות ורכות ב- Java . הכרנו גם עם קישורי פנטום, מחלקה WeakHashMap ו- ReferenceQueue . שימוש נכון בהפניות יעזור באיסוף אשפה ויגרום לניהול זיכרון גמיש יותר ב- Java . מאמר מקורי
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION