שיחרור זיכרון בג’אווה ומתודות Finalize

0

-פרסומת-

שחרור זיכרון בשפת ג’אווה

-פרסומת-

בשפת ג’אווה, כמו שקיים בנאי (Constructor) אשר יוצר אובייקט ומקצה אותו בזכרון, כך קיימת גם מתודה “ההורסת” את האובייקט (Deconstructor) המשחררת את הזיכרון שהיה בשימוש על ידו ומשיבה את אותו זיכרון למערכת ההפעלה. בשפת ג’אווה, כמו בשפות מורדניות רבות אחרות (למשל #C), קיים שימוש במנגנון “איסוף זבל”- garbage collection. מנגנון זה מוריד מן המתכנת (כמעט לגמרי) את האחריות על שיחרור זיכרון (memory release) שבשימוש התוכנית. כתוצאה מכך, המתכנת לא נדרש לדאוג לשחרור הזיכרון בעצמו ומכך נחסכת ממנו מעמסה רבה. זאת בניגוד לשפות שלא תומכות בשיחרור זיכרון אוטומטי כמו שפת C, בהן על המתכנת באופן ידני לשחרר זיכרון שאינו בשימוש עוד (שימוש ב-()free).

אם כך, שפת ג’אווה מאפשרת למתכנתים תיכנות ופיתוח נוח מהירים יותר, לצד פשטות יתר- מניעת באגים הקשורים בשחרור זיכרון ביחס לשפות וותיקות יותר שאינן תומכות בשיחרור זיכרון אוטומטי. מצד שני, כיוון שה-JVM, המערכת הוירטואלית המריצה את תוכניות הג’אווה (JAVA VIRTUAL MACHINE) צריכה להתעסק בעצמה עם שיחרור הזיכרון, פעולה זו, אשר היא אוטומטית, מורידה מביצועי התוכניות הנכתבות ב-JAVA בפרט ובשפות אחרות הפועלות עם שיחרור זיכרון אוטומטי בכלל. ראוי לציין, קיימים מצבים אחדים בהם garbage collector לא ישחרר זיכרון, למרות שאינו בשימוש. דוגמאות כלה ידונו בפוסט העוסק ב”איסוף זבל”. מצב זה יקרא דליפת זיכרון- memory leak.

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

כאשר JVM רוצה לשחרר זיכרון של אובייקט שאינו מוצבע על ידי הפניה (reference) כלשהיא ובטח שאינו בשימוש, היא מפעילה עליו מתודה בשם finalize.

 

-פרסומת-

מתודת ה-Finalize בשפת ג’אווה

כאשר אובייקט “נהרס”, המקום בזיכרון שהוקצה לו הכולל את הנתונים שלו מתפנה וחוזר למערכת ההפעלה. כפי שנאמר, ההריסה מתבצעת באמצעות קריאה למתודת ()finalize. המתודה מוגדרת כך:

protected void finalize() throws Throwable {}

אם מתודה זו נדרסת, עליה לכלול את השורה:

super.finalize();

שורה זו תזמן את המתודה של מחלקת הבסיס בעץ התורשה, לרוב של מחלקת Object (זו הסיבה להרשאת גישה protected), בה מוגדר הקוד שמבצע את שיחרור הזיכרון והחזרתו למערכת ההפעלה.
הסיבות לדריסת מתודה זו היא לשם ביצוע פעולות נוספות בעת “הריסת” האובייקט כמו שיחרור משאבים אחרים שבשימוש.
למתכנת אין שום צורך לזמן את הפעולה בעצמו בשום מקרה, המתודה תזומן על ידי ה-garbage collection בשעת הצורך. מעבר לכך, כאשר מתכנת ינסה להריץ את המתודה, היא גם ככה לא תפנה את הזיכרון כי האובייקט מוצבע ע”י הפניה מסויימת (שממנה זומנה המתודה).


-פרסומת-

עשוי לעניין אותך

הגב

לא נפרסם את האימייל שלך.