
14-09-2007, 19:42
|
|
|
בפשטות? את לא
אין לך שליטה על מתי ישוחרר זכרון כשאת עובדת בסביבת managed code
הכי קרוב שאפשר להגיע לכך בדוט נט הוא ע"י שימוש ב GC.Collect שיכריח את ה GC לעבור לדור הבא ואז הוא כביכול אם לשחרר משאבים שלא זקוקים להם כבר
אבל גם הפעולה הזאת לא מבטיחה ששום זכרון שהוא ישוחרר.
אם מנסים להבין איך ניהול הזכרון עובד בדוט נט, אז הדרך הפשוטה ביותר להסביר את זה, זה לומר שה CLR סופר כל הזמן כמה רפרנסים יש לכל אובייקט שנוצר על ה heap, עם ההיגיון ש"כל עוד מישהו מצביע עליו .. יתכן והוא עוד יצטרך להשתמש בו" ואז הוא לא ישחרר את הזכרון הזה (עם יוצאי דופן כמו WeakReference). זה העניין "בגדול", בפעול הנושא הרבה יותר מורכב.
כך שגם בדוט נט את יכולה להקלע למצבים של דליפות זכרון, אם את שומרת איפשהו רפרנסים לאובייקטים ואף פעם לא מסירה אותם. מה שיגרום לזכרון שהם מצביעים עליו לא להשתחרר לעולם.
אין קשר בין מטודת ה Finalize לבין שחרור זכרון. אפשר להתייחס אליה בתור "דסטרקטור" דוט נטי, ה CLR קורא לה לפני שהוא משמיד את האובייקט שהוא שייך אליו. איך את יכולה לממש אותה? הסינטקס הוא זהה לזה של ++C
משהו כזה:
קוד:
MyClass()
{
public MyClass()
{
// c-tor
}
~MyClass()
{
// Finalize.
// in compile time, the compiler will translate this method to Finalize
// of course you cannoed set access modifiers to this method.
}
}
כנ"ל לגבי מטודת ה Dispose (נמצאת במחלקות שממשות את IDisposable).
משתמשים בה כאשר האובייקט שלך משתמש בכל מיני משאבים שנמצאים מחוץ לגבולות התוכנית שלך (מערכת קבצים, רשתות וכו'...), קריאה לפונקציה הזאת, מוודאת שכל אותם משאבים ישוחררו.
כאשר את משתמשת במחלקה שממשת את IDisposable, את צריכה לקרוא ל Dispose לפני שאת מסיימת להשתמש בה.
אני לא יודע באיזו רמה בדקת שהזכרון שלך לא משתחרר אחרי הפונקציה הזאת, האם הרצה אותה אינסוף פעמים ופשוט ראית שנגמר לך הזכרון במחשב? כי אם מה שעשית זה פשוט להריץ אותה פעם אחת וראית שהזכרון לא משתחרר ... זה לא מדד נכון.
|