הפניות לפנטום בג'אווה

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

במאמר זה נסתכל על המושג הפניה לפנטום - בשפת Java.

2. הפניות לפנטום

להפניות פנטום יש שני הבדלים עיקריים מהפניות רכות וחלשות.

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

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

3. השתמש במקרים

ישנם שני מקרי שימוש נפוצים שהם משמשים אליהם.

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

התרגול השני הוא כדי להימנע משימוש ב- לְסַכֵּם שיטה ולשפר את תהליך סיום.

3.1. דוגמא

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

ראשית, אנו זקוקים לתת-מחלקה של ה- PhantomReference בכיתה להגדרת שיטה לניקוי משאבים:

מחלקה ציבורית LargeObjectFinalizer מרחיב את PhantomReference {public LargeObjectFinalizer (אובייקט הפניה, ReferenceQueue q) {super (referent, q); } חלל ציבורי finalizeResources () {// משאבים חופשיים System.out.println ("ניקוי ..."); }}

עכשיו נכתוב סיום משופר משופשף:

ReferenceQueue referenceQueue = חדש ReferenceQueue (); הפניות לרשימה = ArrayList חדש (); רשימת largeObjects = ArrayList חדש (); עבור (int i = 0; i <10; ++ i) {Object largeObject = אובייקט חדש (); largeObjects.add (largeObject); references.add (LargeObjectFinalizer חדש (largeObject, referenceQueue)); } largeObjects = null; System.gc (); הפניה הפניהFromQueue; עבור (התייחסות PhantomReference: הפניות) {System.out.println (reference.isEnqueued ()); } בעוד ((referenceFromQueue = referenceQueue.poll ())! = null) {((LargeObjectFinalizer) referenceFromQueue) .finalizeResources (); referenceFromQueue.clear (); } 

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

לאחר מכן, אנו יוצרים אובייקטים אלה באמצעות ה- לְהִתְנַגֵד ו LargeObjectFinalizer שיעורים.

לפני שאנו מתקשרים לאוסף הזבל, אנו משחררים ידנית פיסת נתונים גדולה באופן ידני על ידי התייחסות ל- גדול אובייקטים רשימה. שים לב שהשתמשנו בקיצור דרך עבור ה- Runtime.getRuntime (). Gc () הצהרה להפעיל את אספן הזבל.

חשוב לדעת זאת System.gc () אינו מפעיל איסוף זבל באופן מיידי - זה פשוט רמז ל- JVM להפעיל את התהליך.

ה ל לולאה מדגימה כיצד לוודא שכל ההפניות נחקקות - היא תודפס נָכוֹן לכל הפניה.

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

4. מסקנה

במדריך מהיר זה, הצגנו את הפניות הרפאים של ג'אווה.

למדנו מה אלה וכיצד הם יכולים להיות שימושיים בכמה דוגמאות פשוטות ונקודות.


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