היכן נשמר אורך המערך ב- JVM?

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

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

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

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

2. תלות

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

 org.openjdk.jol jol-core 0.10 

3. אורך מערך

ה- JSM של HotSpot משתמש במבנה נתונים הנקרא מצביעי עצמים רגילים (OOP) כדי לייצג מצביעים לאובייקטים. ליתר דיוק, ה- HotVot JVM מייצג את המערכים עם OOP מיוחד שנקרא arrayOop. כל אחד arrayOop כולל כותרת אובייקט עם הפרטים הבאים:

  • מילת סימון אחת לאחסון קוד ה- hash של הזהות או מידע GC
  • מילה קלאסית אחת לאחסון מטא נתונים בכיתה כללית
  • 4 בתים המייצגים את אורך המערך

לָכֵן, ה- JVM שומר את אורך המערך בכותרת האובייקט.

בואו נאמת זאת על ידי בדיקת פריסת הזיכרון של מערך:

int [] ints = int int [42]; System.out.println (ClassLayout.parseInstance (ints) .toPrintable ());

כפי שמוצג לעיל, אנו מנתחים את פריסת הזיכרון ממופע מערך קיים. הנה איך JVM פורש את int []:

[אני מתנגד פנימי: קיזוז גודל סוג תיאור ערך 0 4 (כותרת עצם) 01 00 00 00 (00000001 00000000 00000000 00000000) (1) סימן מס '4 4 (כותרת אובייקט) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) # סימן 8 4 (כותרת עצם) 6d 01 00 f8 (01101101 00000001 00000000 11111000) (-134217363) #klass 12 4 (כותרת אובייקט) 2a 00 00 00 (00101010 00000000 00000000 00000000) (42) אורך מערך 16 168 int [ אני. גודל מופע לא מתאים: 184 בתים

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

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

4. מסקנה

במדריך קצר זה ראינו כיצד JVM שומר את אורך המערך.

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


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