מנגנון איסוף זבל (Garbage collection) משחרר זיכרון שהוקצה דינמית בתוכנית ואין בו עוד שימוש.
המנגנון הומצא ב-1959 על ידי ג'ון מקארתי עבור שפת Lisp. הוא נפוץ בשפות מודרניות כמו Java ו-C#, ובשפות שמורצות על ידי מפרש כגון Python, PHP ו-JavaScript. שפות כמו C ו-C++ לא כוללות איסוף זבל אוטומטי; ב-C++ יש "מצביעים חכמים" (אובייקטים שמנהלים מצביעים בעזרת מניית התייחסויות). שפת Rust פותחת את ניהול הזיכרון כבר בזמן קומפילציה בעזרת מערכת טיפוסים, ובכך ממתגת דליפות זיכרון.
"זבל" הוא זיכרון שהוקצה אך לא יהיה בשימוש. אם לא משחררים זבל, נוצרת דליפת זיכרון. דליפה יכולה לגרום להתייקרות השימוש בזיכרון ולקריסת התוכנית.
במערכות עם איסוף זבל כל האובייקטים מוקצים ב-managed heap (ערימה מנוהלת). המתכנת לא משחרר אובייקטים ידנית. ב-.NET האלגוריתם הנפוץ הוא סימון ומחיקה.
בשיטה זו אוסף הזבל מסמן תחילה את האובייקטים שנגישים מהתוכנית. לאחר מכן מוחקים את האובייקטים שלא סומנו. היתרונות: עובד על כל מבנה נתונים ודורש מעט זיכרון נוסף. החסרונות: איסוף יכול להשעות את התוכנית לזמן מה, ובמקרים של הרבה אובייקטים זה יקר בזמן.
במניית התייחסויות לכל אובייקט יש מונה שמחשב כמה מצביעים אליו. כשהמונה יורד ל-0, האובייקט נמחק מיד. היתרונות: משחרר זיכרון מיידית ולא צריך תהליך המכהה. החסרונות: בעיות בהצבעות מעגליות (A מצביע ל-B ו-B ל-A), ועלות זיכרון וביצועים לעדכון מונים.
בפלטפורמות אלו כל האובייקטים בערימה המנוהלת. יש מנגנוני איסוף מתקדמים המבוססים על סימון/מחיקה ודורות.
Finalization היא שיטה להרצת קוד ניקוי לפני ששחררים את הזיכרון. היא שונה מ-destructor בכך שהיא נקראת מאוחר יותר על ידי אוסף הזבל. שימוש ב-Finalize מאט את שחרור האובייקטים, כי נדרשים שני סיבובי איסוף.
יש טכניקות שמטרתן להקטין את ההשפעה של איסוף הזבל על זמן הריצה.
מצביע חלש (Weak Reference) אינו מונע שחרור אובייקט על ידי אוסף הזבל. זה יעיל לחיסכון בזיכרון באובייקטים גדולים, אך דורש בדיקה לפני גישה.
חלוקת הערימה לדורות מבוססת על הנחה שאובייקטים חדשים נוטים לחיות זמן קצר. אוסף הזבל פועל בעיקר על הדור הצעיר, וכך מקטין את עלות האיסוף הכללי.
איסוף זבל (Garbage collection) הוא דבר בתוכנה שמוחק זיכרון שלא בשימוש.
הרעיון נולד ב-1959 ב-Lisp. שפות מודרניות כמו Java ו-Python משתמשות בו. בשפות כמו C אין אותו.
זיכרון שצריך להימחק נקרא "זבל". אם לא מוחקים אותו יש דליפת זיכרון. דליפה מייתרת זיכרון ויוצרת בעיות בתוכנית.
במערכות עם איסוף הזבל, המתכנת לא צריך לשחרר זיכרון ידנית.
האוסף סורק מה שהתקשר לתוכנית ומסמן אותו. כל מה שלא סומן נמחק.
לכל אובייקט יש ספירה של כמה מצביעים אליו. כשהספירה מגיעה ל-0, האובייקט נמחק.
בעיה: אם שני אובייקטים מצביעים זה על זה, הם לא יימחקו.
לפעמים יש צורך לנקות דברים מיוחדים קודם שזיכרון ישוחרר. זה נקרא Finalize. הוא מאט את השחרור.
מצביע חלש הוא מצביע שלא מונע שחרור האובייקט. זה חוסך זיכרון, אבל צריך לבדוק אם האובייקט עדיין קיים.
אוסף הזבל מחלק אובייקטים לדורות. רוב האובייקטים חיים מעט זמן, לכן בודקים קודם את החדשים.
תגובות גולשים