מהו הקצאת זיכרון בג'אווה? זיכרון ערימה וגיבוב



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

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

מהו זיכרון סטאק?

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





לַעֲרוֹם זיכרון תמיד מופנה LIFO (Last-in-First-Out) להזמין. בכל פעם שמופעלת שיטה, נוצר בלוק חדש בזיכרון הערימה כדי שהשיטה תחזיק בערכים פרימיטיביים מקומיים והתייחסות לאובייקטים אחרים בשיטה.

ברגע שהשיטה מסתיימת, הבלוק הופך ללא בשימוש והופך זמין לשיטה הבאה.



להמיר כפול ל- Java

גודל זיכרון הערימה נמוך מאוד בהשוואה לזיכרון Heap.

תכונות עיקריות של זיכרון מחסנית

מלבד מה שדנו בו עד כה, להלן כמה מאפיינים אחרים של לַעֲרוֹם זיכרון:

  • הוא גדל ומתכווץ כששיטות חדשות נקראות ומחזירות בהתאמה
  • משתנים בתוך הערימה קיימים רק כל עוד השיטה שיצרה אותם פועלת
  • שֶׁלָה באופן אוטומטי מוקצה ומוקצה כאשר השיטה מסיימת את הביצוע
  • אם זיכרון זה מלא, Java זורק java.lang.StackOverFlowError
  • הגישה לזיכרון זה היא מָהִיר בהשוואה לזיכרון ערימה
  • הזיכרון הזה הוא בטוח לחוטים כאשר כל שרשור פועל בערימה משלו

שיטות בשיעור Stack

  • דחיפת אובייקט ( אלמנט אובייקט ): דוחף אלמנט בחלק העליון של הערימה.
  • אובייקט פופ (): מסיר ומחזיר את האלמנט העליון של הערימה. An 'EmptyStackException' יוצא מן הכלל אם נקרא pop () כאשר ערימת ההפעלה ריקה.
  • הצצה לאובייקט (): מחזיר את האלמנט בחלק העליון של הערימה, אך אינו מסיר אותו.
  • בוליאני ריק (): זה מחזיר אמת אם שום דבר לא נמצא בראש הערימה. אחרת, מחזיר שקר.
  • חיפוש int ( אלמנט אובייקט ): זה קובע אם אובייקט קיים בערימה. אם האלמנט נמצא, הוא מחזיר את מיקום האלמנט מראש הערימה. אחרת, זה מחזיר -1.

קוד Java ליישום מחסנית

ייבא java.io. * ייבא java.util. * מחלקה מבחן {ריק סטטי stack_push (מחסנית מחסנית) {עבור (int i = 0 i<5 i++){ stack.push(i) } } static void stack_pop(Stack stack){ System.out.println('Pop :') for(int i = 0 i < 5 i++){ Integer y = (Integer) stack.pop() System.out.println(y) } } static void stack_peek(Stack stack){ Integer element = (Integer) stack.peek() System.out.println('Element on stack top : ' + element) } static void stack_search(Stack stack, int element){ Integer pos = (Integer) stack.search(element) if(pos == -1) System.out.println('Element not found') else System.out.println('Element is found at position ' + pos) } public static void main (String[] args){ Stack stack = new Stack() stack_push(stack) stack_pop(stack) stack_push(stack) stack_peek(stack) stack_search(stack, 2) stack_search(stack, 6) } } 

//תְפוּקָה



memory-allocation-in-java

עכשיו, בואו נעבור לחלל הערימה.

ערימת שטח בג'אווה

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

תכונות עיקריות של זיכרון Java Heap

  • מלבד מה שדנו עד כה, להלן כמה מאפיינים אחרים של שטח ערימה:
  • ניתן לגשת אליו באמצעות טכניקות מורכבות לניהול זיכרון הכוללות דור צעיר, ישן אוֹ דור קבוע, ו דור קבוע
  • אם שטח הערימה מלא, ג'אווה זורקת java.lang.OutOfMemoryError
  • הגישה לזיכרון זה יחסית איטית יותר מזיכרון הערימה
  • בניגוד לערימה, זיכרון זה אינו מוקצה אוטומטית. זה צריך אוסף זבל לפנות חפצים שאינם בשימוש כדי לשמור על יעילות השימוש בזיכרון
  • שלא כמו מחסנית, ערימה אינה בטוח לחוטים ויש לשמור עליו על ידי סנכרון נכון של הקוד

ההבדל בין Java Heap Space לבין Stack Memory

בהתבסס על ההסברים לעיל, אנו יכולים להסיק בקלות את ההבדלים הבאים בין ערימה ו לַעֲרוֹם זיכרון.

  • ערימה הזיכרון משמש את כל חלקי היישום ואילו זיכרון הערימה משמש רק חוט אחד של ביצוע.
  • בכל פעם שנוצר אובייקט, הוא תמיד נשמר בחלל הערימה וזיכרון הערימה מכיל את ההתייחסות אליו. זיכרון הערימה מכיל רק משתנים פרימיטיביים מקומיים ו משתני התייחסות לחפצים במרחב הערימה.
  • אובייקטים המאוחסנים בערמה נגישים ברחבי העולם, ואילו חוטים אחרים אינם יכולים לגשת לזיכרון הערימה.
  • ניהול זיכרון בערימה נעשה בא LIFO באופן שהוא מורכב יותר בזיכרון Heap מכיוון שהוא משמש ברחבי העולם. זיכרון הערמה מחולק ל הדור הצעיר, הדור הישן וכו ', פרטים נוספים ב- Java Garbage Collection.
  • זיכרון הערימה הוא קצרת מועד ואילו זיכרון הערמה חי מההתחלה ועד סוף ביצוע היישום.
  • אנחנו יכולים להשתמש -XMX ו -XMS אפשרות JVM להגדרת גודל ההפעלה והגודל המרבי של זיכרון הערימה. אנחנו יכולים להשתמש -XSS להגדרת גודל זיכרון הערימה.
  • כאשר זיכרון הערימה מלא, זמן הריצה של Java זורק java.lang.StackOverFlowError ואילו אם זיכרון הערימה מלא, הוא זורק java.lang.OutOfMemoryError: שטח ערימת ג'אווהשְׁגִיאָה.
  • גודל זיכרון הערימה נמוך מאוד בהשוואה לזיכרון Heap. בגלל פשטות בהקצאת זיכרון (LIFO), זיכרון הערימה מהיר מאוד בהשוואה ל-זיכרון ערימה.

טבלת השוואה

פָּרָמֶטֶר לַעֲרוֹם ערימה
בסיסי זיכרון מוקצה בבלוק רציףזיכרון מוקצה בסדר אקראי
הקצאה והקצאה אוטומטית על ידי מהדרמדריך על ידי מתכנת
עֲלוּת פָּחוּתיותר
יישום קָשֶׁהקַל
זמן גישה מהר יותראיטי יותר
הנושא העיקרי מחסור בזיכרוןשבר זיכרון
מיקום ההבדל מְעוּלֶהנאות
גְמִישׁוּת שער קבועשינוי גודל אפשרי

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

עכשיו שהבנתהקצאת זיכרון בג'אווהיסודות באמצעות מאמר זה 'הקצאת זיכרון בג'אווה' עיין במאמר מאת אדוריקה, חברת למידה מקוונת מהימנה עם רשת של יותר מ -250,000 לומדים מרוצים הפרוסים ברחבי העולם. קורסי ההדרכה וההסמכה של Java J2EE ו- SOA של אדוריקה מיועדים לסטודנטים ואנשי מקצוע שרוצים להיות מפתחי Java. הקורס נועד לתת לך התחלה בתכנות ג'אווה ולהכשיר אותך למושגי הליבה והמתקדמים של ג'אווה יחד עם מסגרות Java שונות כמו Hibernate & אביב .

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