שאלה:
כתבתי תכנית קטנה, מאוד קטנה, והיא תופסת בערך כ-14,000 KB מהזכרון בזמן ההרצה.
האם ניתן לצמצם את הגודל הזה?
התכנית כתובה ב-C# והיא בסביבת WINForm.
תשובה:
הועלה כאן רעיון יפה להשתמש ב-
Process.GetCurrentProcess().MaxWorkingSet = new IntPtr(1000000);
אישית, הייתי מעדיף לא להגביל בשום שלב את הזכרון שתוכנה דורשת היות וייתכן וכי בנקודת זמן ספציפית היא תדרוש הרבה יותר. במצב כזה או שנאלץ לוותר על הפיצ'ר שדורש הרבה יותר זכרון או יותר סביר שנעלה את גבול הזכרון. בכל מקרה, זה יוצר בעיה רצינית והתעסקות עם זכרון.
במצבים שרוצים בהתחלה לצמצם את גודל התוכנה אפשר לבחור בגישה הרבה פחות תקיפה עם ניהול הזכרון ובמקום להגדיר את המקסימום מינימלי שעוד עלולים להגיע אליו, אפשר להגדיר מינימום זכרון מינימלי. במצב הזה, נגיד למשל לתוכנה "תתחילי עם 100KB" מה שיגרום לה בהתחלה לדרוש 256KB זכרון ווירטואלי.
לפי הצורך ככל שהתוכנה נטענת וככל שהתוכנה רצה היא תבקש ממערכת ההפעלה יותר הקצאות לפי הצורך. הפעולה הזו בהתחלה תוסיף כמה שניות לאתחול התוכנה היות והיא במו"מ ארגסיבי עם עצמה ועם מערכת ההפעלה על הקצאת זכרון ווירטואלי. אם באמת נפתח את Prefmon ונשים Trace על כמות הזכרון הווירטואלי שדורשים תהליכים דוט נטיים אפשר יהיה לראות שבהתחלה יש גרף מדרגות במקום עלייה חדה ומהירה.
// will cause problems (OutOfMemoryException and what not)
Process.GetCurrentProcess().MaxWorkingSet = new IntPtr(10000000);
// will do the same things only by setting the lower bound, will not causes problems, will lengthen loadup time
Process.GetCurrentProcess().MinWorkingSet = new IntPtr(100000);
הנה דוגמה לאפליקציה שנטענת לתוך ה-RAM בלי שום הגבלה:
רק עם הגבלה על הגבול העליון של הזכרון:
רק עם הגבלה על הגבול התחתון של הזכרון:
וכמו שאמרנו, במצב שבו ניתן רק גבול תחתון, אין סיכון שניתקל בגבול העליון או שנאלץ לקבוע גבול עליון שאינו ריאלי למטרתנו.
קישור: http://www.tapuz.co.il/tapuzforum/main/Viewmsg.asp?forum=831&msgid=89241001