DCSIMG
September 2007 - Posts - Yoav Blob

Yoav Blob

September 2007 - Posts

.Net Memory Problems

לאחרונה נתקלתי בתופעה מוזרה, פתחתי אפליקצית .net נקיה וראיתי שהיא תופסת ~8MB. לאחר מכן השתמשתי במחלקות סטנדרטיות של .net והזיכרון שלי הגיע ל20MB.

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

לאחר חיפוש באינטרנט ראיתי את המאמר הבא: Minimize .NET Memory Consumption

המאמר מתאר שימוש בWinAPI לצורך צמצום הזיכרון שמוקצא לאפליקציה ע"י הwindows.

מה שבופעל קורה זה שבתהליך טעינת הAssembly הwindows מקצה הרבה זיכרון לאפליקציה, אבל לאחר השימוש בזיכרון הוא לא מוחזר למערכת הפעלה אלא נשאר אצל האפליקציה למקרה שהיא תצטרך אותו. בשביל שהwindows יקח בחזרה את הזיכרון נבצע קריאה למתודה: SetProcessWorkingSetSize, לפי תיעוד של מיקרוסופט שליחה של -1 יגרום לפעולת הTrim הרצויה.

להלן הקוד המלא:

 

[DllImport("kernel32.dll")]

static extern bool SetProcessWorkingSetSize(IntPtr hProcess, IntPtr

dwMinimumWorkingSetSize, IntPtr dwMaximumWorkingSetSize);

private static void FlushMemory()

{

GC.Collect();

GC.WaitForPendingFinalizers();

SetProcessWorkingSetSize(

Process.GetCurrentProcess().Handle, new IntPtr(-1), new IntPtr(-1));

}