.NET 4.x Утечка памяти при использовании системного счетчика - C#
Формулировка задачи:
Есть некий класс с событием upTimeUpdated (подписчикам отдается время работы ОС)
При создании экземпляра UpTimeCounter и подписки на это событие наблюдаю утечку памяти в приложении. Почему так может быть?
public class UpTimeCounter
{
private PerformanceCounter counter;
private Timer checkingTimer;
Logger logger = LogManager.GetLogger("UpTimeCounter");
public event EventHandler<string> upTimeUpdated;
public UpTimeCounter(int period)
{
counter = new PerformanceCounter("System", "System Up Time");
period = period < 1 ? period : 1000;
StartTimer(period);
}
private void StartTimer(int period)
{
TimerCallback tcb = new TimerCallback(CheckingTimerCallback);
checkingTimer = new Timer(tcb, null, 0, period);
}
public void CheckingTimerCallback(object o)
{
logger.Trace("CheckingTimerCallback has called");
string upTime = "no data";
try
{
counter.NextValue();
upTime = string.Format(TimeSpan.FromSeconds(counter.NextValue()).ToString(@"dd\d\a\y\s\ hh\h\o\u\r\s\ mm\m\i\n\u\t\e\s\ ss\s\e\c\o\n\d\s"));
}
catch (Exception e)
{
logger.Error("error getting uptime: {0}\r\nType: {1}\r\nSource: {2}\r\nStackTrace:\r\n{3}", e.Message, e.GetType(), e.Source, e.StackTrace);
return;
}
upTimeUpdated?.Invoke(this, upTime);
}Решение задачи: «.NET 4.x Утечка памяти при использовании системного счетчика»
textual
Листинг программы
1> !hq tabular from s in ObjectsOfType("System.String") where s.__Size > 100 select new { Str = (string)s, Size = s.__Size }
Str Size
...C:\Temp\VSDebugging\bin\Debug\VSDebugging.exe.C 118
C:\Temp\VSDebugging\bin\Debug\VSDebugging.exe 104
C:\Windows\Microsoft.NET\Framework\v4.0.30319\ 106
...C:\Windows\Microsoft.NET\Framework\v4.0.30319\c 148
...System\CurrentControlSet\Control\Nls\RegionMapp 114
Rows: 5
Time: 697 ms, Memory start: 125.262kb, Memory end: 160.242kb, Memory delta: +34.980kb