זיכרון Java Heap Space עם ממשק ה- API של Runtime

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

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

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

2. גישה לפרמטרים של זיכרון

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

2.1. זיכרון כולל

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

גַם, ערך זה אינו בהכרח מה שבשימוש או הזיכרון המרבי הזמין.

2.2. זיכרון חופשי

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

2.3. זיכרון מרבי

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

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

3. דוגמא

בדוגמה שלהלן אנו מאותחלים את רשימת מערך והוסף אליו אלמנטים תוך מעקב אחר שטח הערימה של JVM באמצעות שלוש השיטות לעיל:

ArrayList arrayList = ArrayList חדש (); System.out.println ("i \ t זיכרון פנוי \ t זיכרון כולל \ זיכרון מרבי"); עבור (int i = 0; i <1000000; i ++) {arrayList.add (i); System.out.println (i + "\ t" + Runtime.getRuntime (). FreeMemory () + "\ t \ t" + Runtime.getRuntime (). TotalMemory () + "\ t \ t" + Runtime.getRuntime () .maxMemory ()); } // ...
פלט: i זיכרון כולל זיכרון פנוי זיכרון מקסימלי 0 254741016 257425408 3817865216 1 254741016 257425408 3817865216 ... 1498 254741016 257425408 3817865216 1499 253398840 257425408 3817865216 1500 253398840 257425408 3817865216 ... 900,079 179,608,120 260,046,848 3817865216 900,080 302,140,152 324,534,272 3817865216 900,081 302,140,152 324,534,272 3817865216 ...
  • שורה 1498: זמן ריצה # freeMemory הערך יורד כאשר מספיק אובייקטים מוקצים לערימת Java.
  • שורה 900080: בשלב זה ל- JVM יש יותר מקום פנוי מכיוון ש- GC רץ ומכאן הערכים של זמן ריצה # freeMemory ו זמן ריצה # totalMemory להגביר.

הערכים המוצגים לעיל צפויים להיות שונים בכל הפעלה של יישום Java.

4. התאמה אישית של פרמטרי זיכרון

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

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

שים לב גם כי -Xms הערך צריך להיות שווה או קטן מה- -Xmx ערך.

4.1. נוֹהָג

java -Xms32M -Xmx64M זיכרון פנוי ראשי: 31792664 בתים זיכרון כולל: 32505856 בתים זיכרון מרבי: 59768832 בתים Java -Xms64M -Xmx64M זיכרון פנוי ראשי: 63480640 בתים זיכרון כולל: 64487424 בתים זיכרון מרבי: 64487424 בתים Java -Xms64M ראשי -Xmx32 במהלך אתחול של VM גודל הערמה הראשוני מוגדר לערך גדול יותר מגודל הערמה המרבי

5. מסקנה

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

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


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