ב-Java, ניהול זיכרון הוא תהליך חיוני. זה מנוהל על ידי Java באופן אוטומטי. ה-JVM מחלק את הזיכרון לשני חלקים: לַעֲרוֹם זיכרון וזיכרון ערימה. מנקודת המבט של ג'אווה, שניהם אזורי זיכרון חשובים אך שניהם משמשים למטרות שונות. ה ההבדל העיקרי בין זיכרון מחסנית לזיכרון ערימה הוא שהמחסנית משמשת לאחסון סדר ביצוע השיטה ומשתנים מקומיים בעוד שזיכרון הערימה מאחסן את האובייקטים והוא משתמש בהקצאת זיכרון דינמית והקצאה. בחלק זה, נדון בהבדלים בין מחסנית לערמה בפירוט.
מחסנית זיכרון
זיכרון המחסנית הוא שטח פיזי (ב-RAM) המוקצה לכל פתיל בזמן ריצה. זה נוצר כאשר חוט יוצר. ניהול הזיכרון בערימה עוקב אחר סדר LIFO (Last-In-First-Out) מכיוון שהוא נגיש באופן גלובלי. הוא מאחסן את המשתנים, הפניות לאובייקטים ותוצאות חלקיות. זיכרון שהוקצה למחסנית חיים עד שהפונקציה תחזור. אם אין מקום ליצירת האובייקטים החדשים, הוא זורק אתjava.lang.StackOverFlowError. היקף האלמנטים מוגבל לחוטים שלהם. ה JVM יוצר ערימה נפרדת לכל חוט.
זיכרון ערימה
הוא נוצר כאשר ה-JVM מופעל ומשמש את האפליקציה כל עוד האפליקציה פועלת. הוא מאחסן אובייקטים ומחלקות JRE. בכל פעם שאנו יוצרים אובייקטים הוא תופס מקום בזיכרון הערימה בעוד שההפניה של אותו אובייקט יוצרת בערימה. זה לא עוקב אחר שום סדר כמו הערימה. הוא מטפל באופן דינמי בחסימות הזיכרון. זה אומר שאנחנו לא צריכים לטפל בזיכרון באופן ידני. לניהול הזיכרון באופן אוטומטי, Java מספק את אספן האשפה שמוחק את החפצים שאינם בשימוש עוד. זיכרון שהוקצה לערימת חיים עד שלא יתרחש אירוע אחד, בין אם התוכנית הופסקה או ללא זיכרון. האלמנטים נגישים באופן גלובלי באפליקציה. זהו מרחב זיכרון משותף המשותף עם כל השרשורים. אם שטח הערימה מלא, הוא זורק אתjava.lang.OutOfMemoryError. זיכרון הערימה מחולק לאזורי הזיכרון הבאים:
- דור צעיר
- מרחב הישרדות
- דור ישן
- דור קבוע
- מטמון קוד
התמונה הבאה מציגה את הקצאת זיכרון מחסנית ושטח ערימה.
ההבדל בין מחסנית לזיכרון ערימה
הטבלה הבאה מסכמת את כל ההבדלים העיקריים בין זיכרון מחסנית ומרחב ערימה.
פָּרָמֶטֶר | מחסנית זיכרון | מרחב ערימה |
---|---|---|
יישום | היא מאחסנת פריטים בעלי חיים קצרים מאוד כגון שיטות, משתנים, ו משתני התייחסות של החפצים. | זה מאחסן חפצים וסביבת זמן ריצה של Java ( JRE ) שיעורים. |
הזמנה | זה עוקב אחר ה LIFO להזמין. | הוא אינו עוקב אחר שום סדר מכיוון שהוא הקצאת זיכרון דינמית ואין לו שום דפוס קבוע להקצאה והקצאה של בלוקי זיכרון. |
גְמִישׁוּת | זה לא גמיש כי אנחנו לא יכולים לשנות את הזיכרון שהוקצה. | זה גָמִישׁ כי אנחנו יכולים לשנות את הזיכרון שהוקצה. |
יְעִילוּת | יש לזה מהיר יותר גישה, הקצאה והקצאה. | יש לזה איטי יותר גישה, הקצאה והקצאה. |
גודל זיכרון | זה קטן יותר במידה. | זה יותר גדול במידה. |
השתמשו באפשרויות Java | אנו יכולים להגדיל את גודל הערימה על ידי שימוש באפשרות JVM -Xss. | אנו יכולים להגדיל או להקטין את גודל זיכרון הערימה באמצעות האפשרויות - Xmx ו-Xms JVM. |
נראות או היקף | המשתנים גלויים רק לשרשור הבעלים. | זה גלוי לכל האשכולות. |
דור של חלל | כאשר נוצר שרשור, מערכת ההפעלה מקצה אוטומטית את המחסנית. | כדי ליצור את ה-heap space עבור האפליקציה, השפה תחילה מתקשרת למערכת ההפעלה בזמן הריצה. |
הפצה | נוצרת מחסנית נפרדת עבור כל אובייקט. | זה משותף בין כל השרשורים. |
חריג זריקות | JVM זורק את java.lang.StackOverFlowError אם גודל הערימה גדול מהמגבלה. כדי למנוע שגיאה זו, הגדל את גודל הערימה. | JVM זורק את java.lang.OutOfMemoryError אם ה-JVM אינו מסוגל ליצור שיטה מקורית חדשה. |
הקצאה/הקצאה | זה נעשה באופן אוטומטי על ידי מַהְדֵר . | זה נעשה באופן ידני על ידי מְתַכנֵת . |
עֲלוּת | העלות שלו היא פָּחוֹת . | העלות שלו היא יותר בהשוואה למחסנית. |
יישום | יישומו הוא קָשֶׁה . | יישומו הוא קַל . |
סדר ההקצאה | הקצאת זיכרון היא רָצִיף . | זיכרון מוקצה ב אַקרַאִי להזמין. |
חוט-בטיחות | זה בטוח לחוט מכיוון שלכל חוט יש ערימה משלו. | הוא אינו בטוח בשרשור, ולכן נדרש סנכרון נכון של הקוד. |