לא ניתן היה לשמור מספיק מקום לערימת אובייקטים

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

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

2. תסמינים

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

java -Xms4G -Xmx4G -jar HelloWorld.jar שגיאה התרחשה במהלך אתחול של VM לא הצליחה לשריין מספיק מקום לערימת אובייקט שגיאה: לא ניתן ליצור את המחשב הווירטואלי של Java. שגיאה: התרחש חריג קטלני. התוכנית תצא.

באופן כללי, ישנם שני תרחישים אפשריים כאשר אנו נתקלים בשגיאה.

ראשית, כשאנחנו אוכלים ארוחת צהריים עם Java פרמטר מגבלת גודל ערימה מקסימלית (-Xmx) והערך הואיותר ממה שיכול להיות לתהליך במערכת ההפעלה.

מגבלת גודל הערימה משתנה בהתאם למספר אילוצים:

  • ארכיטקטורת חומרה (32/64 סיביות)
  • גרסת סיביות JVM (32/64 סיביות)
  • מערכת ההפעלה בה אנו משתמשים

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

3. גודל הערמה

ג'אווה שטח הערימה הוא מאגר הקצאת הזיכרון עבור תוכנית Java בזמן ריצה, המנוהלת על ידי JVM עצמו. כברירת מחדל, מאגר ההקצאות מוגבל לגודל הראשוני והמקסימלי. למידע נוסף על Heap Space ב- Java, עיין במאמר זה כאן.

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

3.1. גודל ערימה מקסימלי

קל לקבוע את מגבלת הערימה התיאורטית המקסימלית עבור JVM של 32 סיביות ו -64 סיביות על ידי הסתכלות על שטח הזיכרון הזמין, 2 ^ 32 (4 ג'יגה-בייט) עבור JVM של 32 סיביות ו -2 ^ 64 (16 אקס-בייט) עבור 64- קצת JVM.

בפועל, בגלל מגבלות שונות, המגבלה יכולה להיות נמוכה בהרבה ומשתנה בהתחשב במערכת ההפעלה. לדוגמה, במערכות Windows של 32 סיביות טווח גודל הערימה המרבי נע בין 1.4 GB ל 1.6 GB. לעומת זאת, במערכות לינוקס של 32 סיביות, גודל הערמה המרבי יכול להימתח עד 3 ג'יגה.

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

3.2. כיצד לשלוט במגבלות גודל הערימה?

יש לנו שתי אפשרויות לשלוט במגבלות גודל הערימה של JVM.

ראשית, באמצעות Java פרמטרים של שורת פקודה בכל אתחול JVM:

-Xms מגדיר את גודל הערימה הראשונית של Java. ערך זה חייב להיות מכפיל של 1024 ומעלה מ- 1 מגהבייט. -Xmx מגדיר גודל ערימה מרבי של Java. ערך זה חייב להיות מכפיל של 1024 וגדול מ -2 MB. -Xmn מגדיר את הגודל ההתחלתי והמקסימלי (בתים) של הערמה עבור הדור הצעיר.

עבור ערך הגודל, אנו עשויים להוסיף מכתב k אוֹ ק, M אוֹ M ו ז אוֹ ז כדי לציין קילובייט, מגה, וג'יגה בהתאמה. אם לא צוין אות, נעשה שימוש ביחידת ברירת המחדל (בתים).

-Xmn2g -Xmn2048m -Xmn2097152k -Xmn2147483648

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

JAVA_OPTS = "- Xms256m -Xmx512m"

למידע נוסף, עיין במדריך הפרמטרים המקיף של JVM.

4. מסקנה

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

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


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