הפניות רכות בג'אווה

1. סקירה כללית

במאמר מהיר זה נדבר על הפניות רכות בג'אווה.

נסביר מה הם, מדוע אנו זקוקים להם וכיצד ליצור אותם.

2. מהן הפניות רכות?

אובייקט ייחוס רך (או אובייקט הניתן להשגה רכה) יכול להתנקות על ידי אספן האשפה בתגובה לדרישת זיכרון. לאובייקט שניתן להגיע אליו בצורה רכה אין אזכורים חזקים המצביעים עליו.

כאשר מתקשר אל אספן אשפה, הוא מתחיל לחזור על כל האלמנטים בערימה. GC מאחסן אובייקטים מסוג הפניה בתור מיוחד.

לאחר שנבדקו כל האובייקטים בערימה, GC קובע אילו מקרים יש להסיר על ידי הסרת אובייקטים מהתור שהוזכר לעיל.

כללים אלה משתנים מיישום JVM אחד למשנהו, אך התיעוד קובע זאת מובטח כי כל ההפניות הרכות לאובייקטים הניתנים להשגה רכים ינוקו לפני ש- JVM זורק OutOfMemoryError.

אף על פי, אין שום התחייבות למועד בו מסומנת התייחסות רכה או הסדר בו קבוצה של אזכורים כאלה לאובייקטים מסולקים.

ככלל, יישומי JVM בוחרים בין ניקוי של הפניות שנוצרו לאחרונה או שהשתמשו לאחרונה.

חפצים הנגישים בעדינות יישארו בחיים זמן מה לאחר הפנייה האחרונה אליהם. ערך ברירת המחדל הוא שנייה של חיים לכל מגה-בייט בערימה. ניתן לכוונן ערך זה באמצעות -XX: SoftRefLRUPolicyMSPerMB דֶגֶל.

לדוגמה, כדי לשנות את הערך ל -2.5 שניות (2500 אלפיות השנייה) נוכל להשתמש ב:

-XX: SoftRefLRUPolicyMSPerMB = 2500

בהשוואה להפניות חלשות, הפניות רכות יכולות להיות ארוכות יותר מכיוון שהן ממשיכות להתקיים עד שנדרש זיכרון נוסף.

לכן, הן בחירה טובה יותר אם עלינו להחזיק חפצים בזיכרון זמן רב ככל האפשר.

3. מקרי שימוש של הפניות רכות

ניתן להשתמש בהפניות רכות ליישום מטמונים הרגישים לזיכרון שבו ניהול זיכרון הוא גורם חשוב מאוד.

כל עוד ניתן להגיע מאוד למפנה של הפניה רכה, כלומר - הוא נמצא בשימוש, ההפניה לא תנקה.

מטמון יכול, למשל, למנוע את השלכת הערכים האחרונים שבהם נעשה שימוש על ידי שמירה על הפניות חזקות לערכים אלו, ולהשאיר את הערכים הנותרים להשליך על פי שיקול דעתו של אספן האשפה.

4. עבודה עם הפניות רכות

ב- Java, התייחסות רכה מיוצגת על ידי ה- java.lang.ref.SoftReference מעמד.

יש לנו שתי אפשרויות לאתחל אותו.

הדרך הראשונה היא להעביר רפרנט בלבד:

בונה StringBuilder = StringBuilder חדש (); SoftReference reference1 = SoftReference חדש (בונה);

האפשרות השנייה מרמזת על העברת התייחסות ל- a java.lang.ref.ReferenceQueue כמו גם התייחסות למפנה. תורי עזר נועדו להודיע ​​לנו על פעולות שמבצע אספן האשפה. הוא מוסיף אובייקט הפניה לתור הפניה מכיוון שהוא מחליט להסיר את הפניה של הפניה זו.

כך ניתן לאתחל א SoftReference עם שורת הפניה:

ReferenceQueue referenceQueue = חדש ReferenceQueue (); SoftReference reference2 = SoftReference חדש (builder, referenceQueue);

כ java.lang.ref. התייחסות, הוא מכיל את השיטות לקבל ו ברור להשיג ולאפס רפרנט בהתאמה:

StringBuilder builder1 = reference2.get (); reference2.clear (); StringBuilder builder2 = reference2.get (); // ריק 

בכל פעם שאנחנו עובדים עם הפניות מסוג זה, עלינו לוודא שמפנה, שהוחזר על ידי לקבל, נוכח:

StringBuilder builder3 = reference2.get (); אם (builder3! = null) {// GC עדיין לא הסיר את המופע} אחרת {// GC פינה את המופע}

5. מסקנה

במדריך זה התוודענו למושג הפניות רכות ולמקרי השימוש בהן.

כמו כן, למדנו כיצד ליצור אחד ולעבוד איתו באופן תכנותי.


$config[zx-auto] not found$config[zx-overlay] not found