logo

ניהול זיכרון ב-Java

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

    מבנה זיכרון JVM עבודתו של אספן האשפה

מבנה זיכרון JVM

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

ניהול זיכרון ב-Java

אזור השיטה

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

  • שם מלא של סוג (לדוגמה: מחרוזת)
  • השינויים של הסוג
  • שם מחלקת העל הישיר של סוג
  • רשימה מובנית של השמות המלאים של ממשקי העל.

אזור ערימה

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

 StringBuilder sb= new StringBuilder(); 

ההצהרה לעיל יוצרת אובייקט של המחלקה StringBuilder. האובייקט מקצה לערימה, וההפניה sb מקצה לערימה. ערימה מחולקת לחלקים הבאים:

  • דור צעיר
  • מרחב הישרדות
  • דור ישן
  • דור קבוע
  • מטמון קוד

סוג התייחסות

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

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

numpy linspace
 StringBuilder sb= new StringBuilder(); 

התייחסות חלשה: זה לא שורד אחרי תהליך איסוף האשפה הבא. אם איננו בטוחים מתי הנתונים יתבקשו שוב. במצב זה, נוכל ליצור התייחסות חלשה אליו. במקרה, אם אוסף האשפה מעבד, הוא הורס את החפץ. כשאנחנו מנסים שוב לאחזר את האובייקט הזה, נקבל ערך null. זה מוגדר ב java.lang.ref.WeakReference מעמד. אנו יכולים ליצור התייחסות חלשה באמצעות ההצהרה הבאה:

 WeakReference reference = new WeakReference(new StringBuilder()); 

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

 SoftReference reference = new SoftReference(new StringBuilder()); 

הפניה לפנטום: זה זמין ב java.lang.ref חֲבִילָה. זה מוגדר ב java.lang.ref.PhantomReference מעמד. ניתן לאסוף את החפץ שיש לו רק התייחסות פנטום המפנה אליהם בכל פעם שאוסף האשפה רוצה לאסוף. אנו יכולים ליצור הפניה לפנטום באמצעות ההצהרה הבאה:

 PhantomReference reference = new PhantomReference(new StringBuilder()); 

אזור ערימה

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

מסגרת מחסנית: מסגרת מחסנית היא מבנה נתונים המכיל את נתוני השרשור. נתוני השרשור מייצגים את מצב השרשור בשיטה הנוכחית.

  • הוא משמש לאחסון תוצאות ונתונים חלקיים. הוא גם מבצע קישור דינמי, ערכים חוזרים לפי שיטות וחריגות שיגור.
  • כאשר שיטה מפעילה, מסגרת חדשה יוצרת. זה הורס את המסגרת כאשר הפעלת השיטה מסתיימת.
  • כל מסגרת מכילה מערך משתנה מקומי (LVA), סטאק אופרנד (OS) ונתוני מסגרת (FD).
  • הגדלים של LVA, OS ו-FD נקבעו בזמן ההידור.
  • רק מסגרת אחת (המסגרת לשיטת ביצוע) פעילה בכל נקודה בשרשור נתון של שליטה. מסגרת זו נקראת המסגרת הנוכחית, והשיטה שלה ידועה בתור השיטה הנוכחית. מחלקת המתודה נקראת המחלקה הנוכחית.
  • המסגרת עוצרת את השיטה הנוכחית, אם השיטה שלה מפעילה שיטה אחרת או אם השיטה מסתיימת.
  • המסגרת שנוצרה על ידי שרשור היא מקומית לאותו חוט ולא ניתן להתייחס אליה על ידי אף שרשור אחר.

מחסנית שיטה מקורית

זה ידוע גם כמחסנית C. זוהי מחסנית לקוד מקורי שנכתב בשפה שאינה ג'אווה. Java Native Interface (JNI) קורא ל-Native Stack. הביצועים של המחסנית המקורית תלויים במערכת ההפעלה.

רישומי מחשב

לכל שרשור יש רשם Program Counter (PC) המשויך אליו. פנקס PC מאחסן את כתובת ההחזרה או מצביע מקורי. הוא מכיל גם את הכתובת של הוראות ה-JVM המבוצעות כעת.

עבודה של אספן אשפה

סקירה כללית של אוסף אשפה

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

איך להוריד מוזיקה

הקצאת אובייקטים

כאשר אובייקט מקצה, ה-JRockit JVM בודק את גודל האובייקט. הוא מבחין בין חפצים קטנים לגדולים. הגודל הקטן והגדול תלוי בגרסת ה-JVM, גודל הערימה, אסטרטגיית איסוף האשפה והפלטפורמה שבה נעשה שימוש. גודלו של אובייקט הוא בדרך כלל בין 2 ל-128 KB.

החפצים הקטנים מאוחסנים באזור Thread Local Area (TLA) שהוא חלק חופשי מהערימה. TLA אינו מסתנכרן עם שרשורים אחרים. כאשר TLA מתמלא, הוא מבקש TLA חדש.

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

מה עושה Java Warbage Collector?

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

הנקודה שצריך להבין היא ש' כאשר חפץ הופך זכאי לאיסוף אשפה? '

לכל תוכנת Java יש יותר משרשור אחד. לכל חוט יש את ערימת הביצוע שלו. יש שרשור להפעיל בתוכנת Java שהוא שיטה main(). כעת אנו יכולים לומר כי חפץ כשיר לאיסוף אשפה כאשר אף שרשור חי אינו יכול לגשת אליו. אספן האשפה רואה בחפץ זה כשיר למחיקה. אם לתוכנית יש משתנה התייחסות שמתייחס לאובייקט, משתנה ההתייחסות הזה זמין לשרשור חי, אובייקט זה נקרא נגיש .

כאן עולה שאלה ש' האם הזיכרון יכול להיגמר ביישום Java? '

מתן שמות למוסכמות ג'אווה

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

סוגי איסוף אשפה

ישנם חמישה סוגים של איסוף אשפה הם כדלקמן:

    GC סדרתי:היא משתמשת בגישת סימן וסוחף עבור דורות צעירים ומבוגרים, שהיא מינורית ומג'ורית.GC מקביל:זה דומה ל-GC סדרתי חוץ מזה שהוא מולידה N (מספר ליבות המעבד במערכת) פתילים לאיסוף אשפה מהדור הצעיר.GC ישן מקביל:זה דומה ל-GC מקביל, אלא שהוא משתמש במספר חוטים עבור שני הדורות.אספן סימן סימון (CMS) במקביל:הוא עושה את איסוף האשפה עבור הדור הישן. אתה יכול להגביל את מספר השרשורים באספן CMS באמצעות XX:ParalleCMSThreads=אפשרות JVM . זה ידוע גם כ-Concurrent Low Pause Collector.אוסף אשפה G1:הוא הוצג ב-Java 7. מטרתו היא להחליף את אספן ה-CMS. זהו אספן מקביל, במקביל ו-CMS. אין מרחב מהדור הצעיר והמבוגר. הוא מחלק את הערימה לכמה ערימות שוות בגודלן. תחילה הוא אוסף את האזורים עם פחות נתונים חיים.

אלגוריתם סימון ומטאטא

JRockit JVM משתמש באלגוריתם סימן, ו-sweep לביצוע איסוף האשפה. הוא מכיל שני שלבים, שלב הסימן ושלב הסוויפ.

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

ניהול זיכרון ב-Java

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

קיימות שתי גרסאות משופרות של סימון וסימון:

    סימן ומטאטא במקביל מקביל סימן ומטאטא

סימן ומטאטא במקביל

זה מאפשר לחוטים להמשיך לרוץ במהלך חלק גדול מאיסוף האשפה. ישנם סוגי סימון הבאים:

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

מקביל סימן ומטאטא

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

arp - פקודה

היתרונות של מארק וסוויפ

  • זה תהליך שחוזר על עצמו.
  • זוהי לולאה אינסופית.
  • לא מותרות תקורה נוספת במהלך ביצוע אלגוריתם.

חסרונות של מארק וסוויפ

  • זה מפסיק את הפעלת התוכנית הרגילה בזמן שאלגוריתם איסוף האשפה פועל.
  • זה פועל מספר פעמים בתוכנית.