כתובת זיכרון של אובייקטים בג'אווה

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

במדריך מהיר זה, נראה כיצד למצוא את כתובת הזיכרון של אובייקטים ב- Java.

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

במדריך זה אנו מתמקדים ביישום JVM ספציפי אחד: ה- HotVot JVM. אנו עשויים להשתמש במונחי JVM ו- HotSpot JVM בערבוביה במהלך ההדרכה.

2. תלות

כדי למצוא את כתובת הזיכרון של אובייקטים ב- JVM, נשתמש בכלי Java Object Layout (JOL). לכן, עלינו להוסיף את jol-core תלות:

 org.openjdk.jol jol-core 0.10 

3. כתובת זיכרון

כדי למצוא את כתובת הזיכרון של אובייקט מסוים ב- JVM, נוכל להשתמש ב- כתובת של() שיטה:

תשובת מחרוזת = "42"; System.out.println ("כתובת הזיכרון היא" + VM.current (). AddressOf (answer));

פעולה זו תדפיס:

כתובת הזיכרון היא 31864981224

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

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

4. קוד קוד זהות

יש תפיסה מוטעית נפוצה לפיה כתובות הזיכרון של אובייקטים ב- JVM מיוצגות כחלק מברירת המחדל שלהם toString יישומים, כגון [מוגן בדוא"ל]. כלומר, רבים חושבים כי ה "60addb54" היא כתובת הזיכרון של אותו אובייקט מסוים.

בואו נבדוק את ההנחה הזו:

אובייקט אובייקט = אובייקט חדש (); System.out.println ("כתובת זיכרון:" + VM.current (). AddressOf (obj)); System.out.println ("toString:" + obj); System.out.println ("hashCode:" + obj.hashCode ()); System.out.println ("hashCode:" + System.identityHashCode (obj));

פעולה זו תדפיס את הדברים הבאים:

כתובת זיכרון: 31879960584 ל- String: [דוא"ל מוגן] hashCode: 1622006612 hashCode: 1622006612

באופן די מעניין, ה "60addb54" היא הגרסה ההקסדצימאלית של קוד ה- hash, שהוא 1622006612 hashCode () שיטה היא אחת השיטות הנפוצות עבור כל אובייקטים Java. כאשר אנו לא מכריזים על א hashCode () שיטה עבור מחלקה, Java תשתמש בקוד hash הזהות עבור זה.

כפי שמוצג לעיל, קוד חשיש הזהות (החלק הזה אחרי @ ב toString) וכתובת הזיכרון שונה.

5. מסקנה

במדריך קצר זה ראינו כיצד למצוא את כתובת הזיכרון של אובייקטים בג'אווה.

כרגיל, כל הדוגמאות זמינות ב- GitHub.


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