Наше приложение утечки памяти. Мы можем наблюдать за размером памяти go в Диспетчере задач, и в итоге он вызывает исключение OutOfMemory. Поскольку он все еще находится в бета-версии, и для достижения этой цели требуется несколько недель, он пока еще не продемонстрирован, но мы не можем официально выпустить его, пока не решим эту проблему.
Одна часть программы запускает расчет с заданным интервалом. Мы хотим посмотреть, протекает ли эта часть. Если мы изменим интервал, наклон графика потребления памяти в зависимости от времени должен измениться пропорционально.
Итак, я написал небольшую программу, которая должна была прочитать размер частного рабочего набора всех процессов, которые имеют имя нашего приложения. Важный раздел этой программы ниже. Проблема, с которой я сталкиваюсь, заключается в том, что нет прямого способа получить размер частного рабочего набора. Вместо этого мне нужно получить счетчик производительности, и нет способа получить этот счетчик по идентификатору процесса. Вы можете получить его только по имени. Поскольку у меня есть два процесса с одним и тем же именем, я всегда получаю размер рабочего набора для первого процесса и никогда для второго. Есть ли способ получить счетчик производительности, используя идентификатор процесса вместо имени процесса? Есть ли лучший показатель памяти, который по-прежнему будет указывать на то, есть ли у меня утечка памяти, даже если число не совпадает с тем, которое я вижу в диспетчере задач?
Для будущих тестов я мог бы просто изменить имя одного исполняемого файла перед началом теста, но я бы предпочел не делать этого, и я бы не стал перезапускать текущий тест.
List<int> processIDs = new List<int>();
foreach (Process namedProcess in namedProcesses)
{
processIDs.Add(namedProcess.Id);
}
List<Process> simShopProcesses = new List<Process>();
// foreach (Process namedProcess in simShopProcesses)
foreach (int processID in processIDs)
{
Process simShopProcess = Process.GetProcessById(processID);
PerformanceCounter pc = new PerformanceCounter(("Process", "Working Set - Private", simShopProcess.ProcessName);
double pws = pc.RawValue / 1024.0;
//private void timer1_Tick(object sender, EventArgs e)
//{
// System.Diagnostics.Process[] simShopProcesses = System.Diagnostics.Process.GetProcessesByName("SimShopService");
// if (simShopProcesses.Count() > 0)
// {
// textBox1.Text = simShopProcesses[0].NonpagedSystemMemorySize64.ToString();
// textBox1.Refresh();
// }
//}
double npsm = simShopProcess.NonpagedSystemMemorySize64;
memorySet.Process_id = simShopProcess.Id;
memorySet.Reading_time = DateTime.Now;
memorySet.Private_working_set = pws;
memorySet.Nonpaged_system_memory = npsm;
memorySet.Thread_count = simShopProcess.Threads.Count;
WriteMessage(string.Format("Process ID: {3}: Private working set: {0} Kb; nonpaged system memory: {1} Kb; thread count: {2}",
pws, npsm, simShopProcess.Threads.Count, simShopProcess.Id));
memorySet.Insert();
memorySet.Close();
if (pws > m_memoryLimit && m_memoryLimit > 0)
{
WriteMessage(string.Format("Memory usage exceeds limit of {0}; killing process.", m_memoryLimit));
KillService(simShopProcesses[0]);
}
pc.Close();
}