Thursday, February 17, 2011

ביצועים - זכרת לשחרר זיכרון ?

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

מה הבעיה בדיוק ?
חלק מהאובייקטים בשרפוינט עובדים על גבי קוד לא מנוהל, קרי יש לשחרר את הזכרון שהתם תפסו בסוף השימוש.
מי הם ?
SPSite, SPWeb , SharePoint WebService objects.
כל פעם שיש לכם שימוש בהם, זה צריך להדליק לכם תזכורת שכנראה תצטרכו לנקות אחריהם...
גם אם הם מגיעים בוארציות שונות( אך לא תמיד ).

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

אז זה חשוב, איך עושים את זה ?
כלל האוביקטים הללו יורשים מ
IDisposable
אז נוכל לשחרר את הזכרון בעצמנו.

יש לכך שלוש גישות -

1. שחרור זכרון באופן "ידני"
 
SPSite site = new SPSite("http://mysite");
//do some work
site.Dispose();


2. שימוש ב try ו catch
 
try{
SPSite site = new SPSite("http://mysite");
//do some work
return ...
}
catch (Exception e ){
//handle the exception
}
finally
{
if(site!=null)
site.dispose();
}

3. שימוש ב USING , הכל אוטומטי...
 
using(SPSite site = new SPSite("http://mysite")
{
using(SPWeb web = site.OpenWeb())
{
\\do more stuff
}
}


חשוב להכיר מתי צריך לשחרר זיכרון ומתי לא, למשל שמקבלים אוסף של אתרים, האם יש צורך לשחרר גם אותו או לא ? או למשל אתר שורש , כן או לא ?

ממליץ לקרוא את המאמר הבא כדי להבין את הנושא באופן מושלם
לינק למאמר
בהצלחה.

No comments:

Post a Comment