logo

משחתת ג'אווה

בג'אווה, כאשר אנו יוצרים אובייקט של המחלקה הוא תופס מקום כלשהו בזיכרון (ערימה). אם לא נמחק את האובייקטים הללו, הוא נשאר בזיכרון ותופס מקום מיותר שאינו זקוף מהיבט התכנות. כדי לפתור בעיה זו, אנו משתמשים ב- מַשׁחֶתֶת . בחלק זה, נדון באפשרות החלופית ל- הרס ב-Java . כמו כן, נלמד גם כיצד להשתמש ב- לְסַכֵּם() השיטה בתור הורס.

ה מַשׁחֶתֶת הוא ההפך מהקונסטרוקטור. הבנאי משמש לאתחול אובייקטים בעוד שההרס משמש למחיקת או השמדה של האובייקט שמשחרר את המשאב שנכבש על ידי האובייקט.

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

מהו ההרס בג'אווה?

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

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

היתרונות של Destructor

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

איך הרסנית עובדת?

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

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

שיטת Java finalize()

למתכנת קשה להוציא להורג בכוח את אוסף האשפה כדי להשמיד את החפץ. אבל Java מספקת דרך חלופית לעשות את אותו הדבר. מחלקת Java Object מספקת את לְסַכֵּם() שיטה שפועלת כמו המשמיד. התחביר של שיטת finalize() הוא כדלקמן:

תחביר:

 protected void finalize throws Throwable() { //resources to be close } 

זה לא הרס אבל זה מספק אבטחה נוספת. זה מבטיח שימוש במשאבים חיצוניים כמו סגירת הקובץ וכו' לפני כיבוי התוכנית. אנחנו יכולים לקרוא לזה על ידי שימוש בשיטה עצמה או הפעלת השיטה System.runFinalizersOnExit(true) .

  • זוהי שיטה מוגנת של מחלקת Object המוגדרת בחבילת java.lang.
  • ניתן להתקשר אליו רק פעם אחת.
  • אנחנו צריכים לקרוא למתודה finalize() במפורש אם אנחנו רוצים לעקוף את השיטה.
  • ה-gc() היא שיטה של ​​JVM המבוצעת על ידי ה-Garbage Collector. הוא מפעיל כאשר זיכרון הערימה מלא ודורש יותר זיכרון עבור אובייקטים חדשים שמגיעים.
  • מלבד החריגים הלא מסומנים, ה-JVM מתעלם מכל החריגים המתרחשים בשיטת finalize() .

דוגמה של Destructor

DestructorExample.java

 public class DestructorExample { public static void main(String[] args) { DestructorExample de = new DestructorExample (); de.finalize(); de = null; System.gc(); System.out.println('Inside the main() method'); } protected void finalize() { System.out.println('Object is destroyed by the Garbage Collector'); } } 

תְפוּקָה:

 Object is destroyed by the Garbage Collector Inside the main() method Object is destroyed by the Garbage Collector