OutOfMemoryError: חריגה ממגבלת התקורה של GC

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

במילים פשוטות, ה- JVM דואג לפנות זיכרון כאשר כבר לא משתמשים באובייקטים; תהליך זה נקרא Garbage Collection (GC).

ה מגבלת התקורה של GC חרגה שגיאה היא אחת ממשפחת java.lang.OutOfMemoryError והוא אינדיקציה למיצוי משאב (זיכרון).

במאמר מהיר זה, נבחן מה גורם ל java.lang.OutOfMemoryError: חריגה ממגבלת התקורה של GC שגיאה וכיצד ניתן לפתור אותה.

2. חריגה ממגבלת התקורה של GC

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

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

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

3. שגיאה בפעולה

בואו נסתכל על פיסת קוד שזורקת java.lang.OutOfMemoryError: חריגה ממגבלת התקורה של GC.

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

מחלקה ציבורית OutOfMemoryGCLimitExceed {public static void addRandomDataToMap () {Map dataMap = HashMap new (); אקראי r = אקראי חדש (); בעוד (נכון) {dataMap.put (r.nextInt (), String.valueOf (r.nextInt ())); }}}

כאשר מופעלת שיטה זו, עם טיעוני JVM כ -Xmx100m -XX: + UseParallelGC (גודל הערימה של Java מוגדר ל- 100MB ואלגוריתם GC הוא ParallelGC), נקבל java.lang.OutOfMemoryError: חריגה ממגבלת התקורה של GC שְׁגִיאָה. כדי להבין טוב יותר את האלגוריתמים השונים של אוסף האשפה נוכל לבדוק את הדרכה בסיסית של אוסף הזבל של אורקל.

נקבל java.lang.OutOfMemoryError: חריגה ממגבלת התקורה של GC שגיאה במהירות רבה על ידי הפעלת הפקודה הבאה משורש הפרויקט:

mvn exec: exec

כמו כן יש לציין כי במצבים מסוימים אנו עלולים להיתקל בשגיאת שטח ערימה לפני שנתקל ב מגבלת התקורה של GC חרגה שְׁגִיאָה.

4. פתרון שגיאת חריגה ממגבלת התקורה של GC

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

יש להתייחס לשאלות הבאות:

  • מהם האובייקטים ביישום שתופסים חלקים גדולים של הערמה?
  • באילו חלקים בקוד המקור מוקצים האובייקטים הללו?

אנו יכולים גם להשתמש בכלים גרפיים אוטומטיים כגון JConsole המסייעים לאיתור בעיות ביצועים בקוד כולל java.lang.OutOfMemoryErrors.

המוצא האחרון יהיה הגדלת גודל הערימה על ידי שינוי תצורת ההשקה של JVM. לדוגמה, זה נותן שטח ערימה של 1GB ליישום Java:

java -Xmx1024m com.xyz.TheClassName

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

5. מסקנה

במדריך זה בחנו את java.lang.OutOfMemoryError: חריגה ממגבלת התקורה של GC והסיבות שעומדות מאחוריו.

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


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