ניתוח זליגת זכרון

לא הוסיף מידע רב

משתחזר באופן קבוע.
פתיחה של הdumps מראה רק שהמשתנים הללו מגיעים מ- System.Threading.TimerQueueTimer
בתוך כל הקוד שלי (יש די הרבה timers), כל מטפל נראה באופן כללי כך:
קוד:
        private void TmrHanbdler(object sender, EventArgs e)
        {
            this.tmr.Stop();
            try
            {
                //Handle timer event
            }
            catch (Exception err)
            {
               //Handle errors
            }
            this.tmr.Start();
        }
בכניסה למטפל יש stop על הtimer, וביציאה הפעלה מחדש (בדיוק כדי למנוע תופעות כאלה).
עדיין אין לי רעיון מה לדבג ...
 

nocgod

New member
נראה שאתה נרשם על event

תוודא שאתה עושה את זה פעם אחת בלבד ותוודא שאתה גם עושה unregister לhandler כי אחרת זו זליגת זיכרון
 

nocgod

New member
אם אתה משתמש ב WorkerThread שים לב שקורא ל Dispose

או משתמש בו בתוך using statement
גם זה עלול לגרום ל resource/memory leak

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

הסתבכתי.
תכנה "זולגת זכרון".
הרצתי עם anakysit tool (מגיע עם VS-2017), והתקבלו התוצאות הבאות:
האוביטק שמנפח את הזכרון בצורה המשמעותית ביותר הוא ThreadPoolWorkQueue+WorkStealingQueue .
בדיקה על כמות הthreads שרצים - ללא שינוי מתחילת הריצה (25).
גוגל לא מצא שום מאמר סביר שיקשר בין טיפוסי המשתנים שהצגתי ובין זליגת זכרון.
רעיון מה אני צריך לחפש בהמשך? בקוד מתבצע שמוש די מאסיבי בטיימרים לקריאת נתונים שמגיעים בudp (לאחר שהתברר ששמוש בbeginReceive גורם לזליגת משאבים של sockets ותצרוכת מאסיבית של ipEndPoint עד לתקיעה של תוכנות אחרות שמשתמשות בשקעי UDP). אני משער שיש קשר.
קוד:
        private void tmrHandlePending_timer(object sender, EventArgs e)
        {
            tmrHandlePending.Stop();
			WaitingToDataFromTimer();
            tmrHandlePending.Start();
		}
		
        private void WaitingToDataFromTimer()
        {
            Byte[] byteData = null;
            Byte[] dstBytes = null;
	    IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0); ;
	    if (0 == socket.Available)
		{
			return;
		}
		lock (globalLocker)
		{
			byteData = socket.Receive(ref remoteEP);
			dstBytes = byteData.ToArray();
			HandleData(dstBytes);
		}
        }

	void HandleData(Bytes[] b) 
	{
		//Some processing data - While jumping from loop to test it with random values, no memo leaking happened
	}


 
ההרשמה על הevent מתבצעת רק בהקמה של האוביקט המכיל

כל האוביקטים המכילים מוקמים בעלייה של המערכת, ונשארים עד עצירת הקוד. (לא בונה ומפרק את האוביקטים הרשומים על ה timers, כי אני צריך אותם קבועים והם מחזיקים נתונים קבועים לריצה).
&nbsp
 
לא משתמש בהם באופן ישיר.

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

nocgod

New member
תעשה איזה קוד דמו שמשחזר מצד אחד את הבעיה

ומצד שני יהיה מספיק לא קשור לעסק שתוכל לשתף אותו על מנת שנוכל להסתכל עליו...
אני אוהב לחטט ב dumps וכל מיני שיט כזה... או אולי התרגלתי לזה כל כך מהעבודה שהתחלתי לאהוב את זה D:
 
למעלה