Permgen לעומת Metaspace בג'אווה

1. הקדמה

במדריך המהיר הזה, נבחן את ההבדלים בין אזורי הזיכרון של PermGen ו- Metaspace בסביבת ג'אווה.

חשוב לזכור כי החל מ- Java 8, ה- Metaspace מחליף את ה- PermGen - מה שמביא לשינויים מהותיים.

2. פרמגן

PermGen (דור קבוע) הוא שטח ערימה מיוחד המופרד מערמת הזיכרון הראשית.

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

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

גודל הזיכרון המרבי המוגדר כברירת מחדל עבור JVM של 32 סיביות הוא 64 מגה-בייט ו -82 מגה-בייט עבור גרסת 64 סיביות.

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

  • -XX: PermSize = [size] הוא הגודל הראשוני או המינימלי של שטח PermGen
  • -XX: MaxPermSize = [size] הוא הגודל המקסימלי

הכי חשוב, אורקל הסירה לחלוטין את שטח הזיכרון הזה במהדורת JDK 8. לכן, אם נשתמש בדגלי כוונון אלה בג'אווה 8 ובגרסאות חדשות יותר, נקבל את האזהרות הבאות:

>> java -XX: PermSize = 100m -XX: MaxPermSize = 200m- גרסת OpenJDK 64-bit Server Server אזהרה: התעלמות מאפשרת PermSize; התמיכה הוסרה ב- 8.0 OpenJDK 64-bit Server אזהרת VM: התעלמות מאפשרות MaxPermSize; התמיכה הוסרה ב- 8.0 ...

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

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

3. Metaspace

במילים פשוטות, Metaspace הוא שטח זיכרון חדש - החל מגרסת Java 8; הוא החליף את שטח הזיכרון הישן יותר של PermGen. ההבדל המשמעותי ביותר הוא האופן שבו היא מטפלת בהקצאת זיכרון.

במיוחד, אזור זיכרון מקורי זה גדל אוטומטית כברירת מחדל.

יש לנו גם דגלים חדשים כדי לכוון את הזיכרון:

  • MetaspaceSize ו MaxMetaspaceSize - אנחנו יכולים להגדיר את הגבולות העליונים של Metaspace.
  • MinMetaspaceFreeRatio - הוא האחוז המינימלי של קיבולת המטא נתונים בכיתה לאחר איסוף האשפה
  • MaxMetaspaceFreeRatio - הוא האחוז המקסימלי של קיבולת המטא-נתונים בכיתה לאחר איסוף אשפה בכדי למנוע צמצום בכמות השטח

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

לָכֵן, עם שיפור זה, JVM מקטין את הסיכוי להשיג את OutOfMemory שְׁגִיאָה.

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

4. סיכום

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

PermGen עדיין קיים עם JDK 7 וגרסאות ישנות יותר, אך Metaspace מציעה שימוש בזיכרון גמיש ואמין יותר ליישומים שלנו.