מבוא למטמון קוד JVM

1. הקדמה

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

2. מהו מטמון הקוד?

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

מהדר ה- just-in-time (JIT) הוא הצרכן הגדול ביותר באזור מטמון הקוד. לכן יש מפתחים שקוראים לזיכרון זה מטמון קוד JIT.

3. כוונון מטמון קוד

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

  • InitialCodeCacheSize - גודל המטמון הראשוני של הקוד, ברירת מחדל של 160K
  • ReservedCodeCacheSize הגודל המקסימלי המוגדר כברירת מחדל הוא 48MB
  • CodeCacheExpansionSize - גודל ההרחבה של מטמון הקוד, 32KB או 64KB

הגדלת ReservedCodeCacheSize יכול להיות פיתרון, אך בדרך כלל מדובר רק בפתרון זמני.

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

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

4. שימוש במטמון קוד

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

כדי לקבל מידע על השימוש במטמון קוד, אנו יכולים לציין את –XX: + PrintCodeCache אפשרות JVM. לאחר הפעלת היישום שלנו, נראה פלט דומה:

CodeCache: גודל = 32768Kb בשימוש = 542Kb max_used = 542Kb פנוי = 32226Kb 

בואו נראה מה המשמעות של כל אחד מהערכים האלה:

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

ה PrintCodeCache אפשרות שימושית מאוד, כפי שאנו יכולים:

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

5. מטמון קוד מפולח

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

  • הקטע שאינו שיטה מכיל קוד קשור פנימי ל- JVM כגון המתורגמן. כברירת מחדל, פלח זה הוא כ -5 מגה בייט. כמו כן, ניתן להגדיר את גודל הקטע באמצעות ה- -XX: NonNMethodCodeHeapSize כוונון דגל
  • פלח הקוד המסומן מכיל קוד אופטימיזציה קלה עם אורך חיים קצר. למרות שגודל הקטע הוא בסביבות 122 מגה בייט כברירת מחדל, אנו יכולים לשנות אותו באמצעות ה- -XX: ProfiledCodeHeapSize כוונון דגל
  • הקטע שאינו מוגדר בפרופיל מכיל קוד מותאם לחלוטין עם אורך חיים ארוך. באופן דומה, זה בערך 122 מגה בייט כברירת מחדל. ניתן להגדיר, כמובן, דרך ה- -XX: NonProfiledCodeHeapSize כוונון דגל

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

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

6. מסקנה

מאמר מהיר זה מציג הקדמה קצרה למטמון הקוד JVM.

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


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