Я пытаюсь отслеживать утечку памяти в моем приложении .NET. Диспетчер задач Windows сообщает, что использование памяти остается постоянным, а Process Explorer сообщает, что использование памяти увеличивается.Диспетчер задач не согласен с Process Explorer?
В диспетчере задач я смотрю в единственном столбце памяти «Память (частный рабочий набор)». В Process Explorer я просматриваю столбец «Private bytes», потому что он поднимается, а значение в «Рабочем наборе» - нет.
Теперь, конечно, Process Explorer является правильным, потому что после нескольких распределений мое приложение выходит из строя с ошибкой Исключение из памяти. Вопрос в том, Почему диспетчер задач неверно описывает использование памяти в приложении? Не только это, но и неверно отражает глобальную свободную память системы (график на вкладке «Производительность» остается постоянным).
Мой код не нужен, но здесь он для полноты. Он показывает пустое окно, содержащее большой массив. При нажатии любой клавиши окно закрывается и открывается новый, удерживая новый массив. Произошло старое окно, возможно, из-за ошибки в библиотеке GUI qt4dotnet.
using System;
using com.trolltech.qt.gui;
namespace LeakTest
{
class Test : QWidget
{
public byte[] Data = new byte[1000 * 1000 * 100];
public Test()
{
show();
GC.Collect(); // so measurements are more accurate
}
protected override void keyPressEvent(QKeyEvent arg__1)
{
disposeLater();
new Test();
}
[STAThread]
static void Main(string[] args)
{
QApplication.initialize(args);
new Test();
QApplication.exec();
}
}
}
ОС: Windows 7
Интересное примечание: когда я делаю "Data" 2D-зубчатыми массив размеров [1000 * 1000 * 100][1]
, Диспетчер задач делает отчет повышения использования памяти.
Я бы проголосовал против использования диспетчера задач/Process Explorer для поиска утечек .NET Memory.Узумно, я использую [ANTS Memory Profiler] (http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/) и даже с помощью такого специализированного инструмента довольно сложно найти утечки , У меня не было бы шанса когда-либо найти утечку в прошлом, если бы я просто использовал диспетчер задач. –
Страницы, которые никогда не использовались, не нуждаются в какой-либо поддержке, так как они могут быть только при первом доступе. Поэтому они считаются частными байтами, но не нуждаются в ОЗУ и не являются частью рабочего набора. – CodesInChaos
@CodeInChaos: ах, это многое объясняет. –