Диспетчер задач не согласен с Process Explorer? - PullRequest
3 голосов
/ 04 февраля 2011

Я пытаюсь отследить утечку памяти в моем приложении .NET.Диспетчер задач Windows сообщает, что использование памяти остается постоянным, в то время как Process Explorer сообщает, что использование памяти увеличивается.

В диспетчере задач я просматриваю единственный столбец памяти «Память».(Частный рабочий набор) ».В Process Explorer я просматриваю столбец «Private bytes», потому что он поднимается, а значение в «Working set» - нет.

Теперь, безусловно, Process Explorer является правильным, потому что после нескольких выделений мойприложение вылетает с исключением Недостаточно памяти .Вопрос в том, почему диспетчер задач искажает использование памяти приложением ?Мало того, это также неверно отображает глобальную свободную память системы (график на вкладке «Производительность» остается постоянным).

Мой код не нужен, но здесь он для полноты. Это показывает пустое окно, которое содержит большой массив.При нажатии любой клавиши окно закрывается, и открывается новый, содержащий новый массив.Старое окно просочилось, вероятно, из-за ошибки в библиотеке графического интерфейса 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

Интересное примечание: когда я делаю "Данные"двумерный неровный массив измерений [1000 * 1000 * 100][1], диспетчер задач сообщает о повышении использования памяти.

Ответы [ 2 ]

6 голосов
/ 04 февраля 2011

Это две совершенно разные меры памяти. Рабочий набор - это объем оперативной памяти, который использует ваша программа. Это постоянно меняющееся число и зависит от того, сколько оперативной памяти требуется другим процессам. Вы не можете исчерпать ОЗУ, Windows делает ОЗУ доступным вам, заменяя сопоставленные страницы в файле подкачки.

Частных байтов - это объем виртуальной памяти, используемой вашей программой, который не используется другим процессом. На 32-разрядной машине доступно 2 гигабайта виртуальной памяти. Это должно быть разделено между кодом и данными. Вы получаете OOM, когда в адресуемом объеме виртуальной памяти не хватает места для запрошенного выделения. Да, это более точное число.

Запрашивать 100 мегабайт за раз рискованно. Пространство виртуальной памяти может быть фрагментировано, и через некоторое время может все еще появиться много свободной виртуальной памяти, но не будет дыры, достаточно большой, чтобы вместить 100 мегабайт. Зубчатый массив решает эту проблему, потому что это массив массивов, необходимые куски намного меньше, поэтому могут легко помещаться в любые оставшиеся отверстия.

64-разрядная операционная система полностью решает эту проблему. Ваша программа имеет много гигабайт доступного адресного пространства, на практике ограничивается только максимальным размером файла подкачки. Вы просто не можете выбежать из больших дыр.

1 голос
/ 04 февраля 2011

Если вы хотите отследить утечку памяти и не можете ее найти, прочитав код, то вам, вероятно, нужен реальный инструмент, предназначенный для этой работы.

Ни диспетчер задач, ни процессПроводник - это подходящий инструмент для устранения утечек памяти - вам нужно что-то, что скажет вам, где вы выделяете память, которая не возвращается.

...