איתור זליגת זכרון

איתור זליגת זכרון

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

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

 
שכחתי לציין - התכנה כתובה בC#, תוך שמוש בVS2017

השרת - microsoft server 2012 r2 רץ במכונה וירטואלית (ככל הנראה vmware, "סוד" של הלקוח).
מחשב הבדיקות - microsoft server 2012 r2 בגרסת הtrial של מיקרוסופט, מופעל בתוך oracle virtualbox. נבדק גם על מכונה פיזית שסיפקה תוצאות דומות. השרת רץ בתוך vmware אצל לקוחות אחרים שאין אצלם זליגת זכרון.
 

nocgod

New member
קח dump מהסרוויס הזה בזמן שיש לו את הזליגת זיכרון

קודם כל תריץ עליו את debug diag 2 של מיקרוסופט ותקבל איזשהו ניתוח בסיסי שאולי יתן לך כיוון.
במקרה וזה לא מספיק - פתח את הdump ב dotTrace (או כלי דומה שנוח לך ואתה מכיר) ותתחיל לחפש מי הם האובייקטים ששורדים הכי הרבה זמן ומי מחזיק אותם.
במקרה וגם זה לא מספיק - קח כמה dumps נגיד 10 ותבדוק את ה deltas ביניהם, שוב עם כלי שאתה מכיר ונוח לך
 
המשך ה"חידה"

לפי כל הבדיקות, קטע הקוד הבא גורם לזליגה:
קוד:
            public String DoTest()
            {
                String fileContent = "";
                String fileName = "";
                String[] filesNames = System.IO.Directory.GetFiles(logDir);
                List<String> contents = new List<string>();

                for (int i = 0; i < filesNames.Length; i++)
                {
                    fileName = filesNames[i];
                    if (fileName.ToLower().Contains("aud"))
                    {
                        contents.Add(System.IO.File.ReadAllText(fileName));
                    }
                }
                fileContent = String.Join("", contents);
                return fileContent;
            }
לפני הקריאה לקוד דרישת הזכרון של האוביקט היא באזור ה1.4 מגה (הגיוני, יש לו עוד נתונים). לאחר הקריאה - הדרישה עולה רגעית לסדר גודל של 100 מגה, ואז מתיצבת על 70. (לא חוזרת לערך המקורי).
 

nocgod

New member
אתה שומר את fileContents כשדה על האובייקט באיזשהו שלב?

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

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

בכל מקרה - הייתי כותב את זה קצת אחרת
קוד:
public string DoTest()
	=> Directory.GetFiles("yourDir")
			.Where(file => file.ToLower().Contains("aud"))
			.Select(File.ReadAllText)
			.Aggregate(new StringBuilder(), (sb, content) => sb.Append(content))
			.ToString();
קצר יותר ומסביר מה לעשות לא איך.
אבל על טעם ועל ריח...
 
לא שומר שום דבר על האוביקט.

בקובץ "בדיקה" - לאוביקט יש רק 2 מתודות ואין לו משתנים. ותודה על הרעיון, אבדוק ביום ראשון.
&nbsp
 
למעלה