Насколько надежен диспетчер задач Windows для определения использования памяти программами? - PullRequest
4 голосов
/ 20 апреля 2011

Можно ли использовать диспетчер задач для обнаружения огромных утечек памяти? У меня есть небольшая программа синтаксического анализа текста, которая показывает, что при запуске я использую около 640 КБ памяти. Когда я анализирую файл и индексирую его, использование памяти увеличивается в зависимости от размера файла. Затем, когда я «очищаю» индекс, мое использование памяти падает примерно до 1400K. После этого я могу добавить столько файлов, сколько захочу, и когда я очищаю индекс, использование памяти падает до этого уровня 1400k + или - ~ 5%.

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

Я понимаю, что это, вероятно, "хакерский" способ для профилирования моего приложения, но я студент, и все, что я смог найти, - это коммерческие инструменты профилирования, которые недоступны. Я также читал о valgrind, который является только Linux, и я работаю на Windows. Является ли использование диспетчера задач точным или я ошибаюсь?

Ответы [ 2 ]

7 голосов
/ 20 апреля 2011

TaskMgr слишком груб для этой цели. Особенно, если у вас есть много динамических распределений и освобождений, которые приведут к сильно фрагментированной памяти кучи, и в этом случае трудно различить утечки и естественный рост кучи из-за фрагментации. Вы должны использовать вызовы Win32 API для проверки общего объема памяти, выделенной вашим приложением. Несколько лет назад, когда у меня все еще были проблемы с утечками памяти (таких больше нет благодаря RAII), я использовал для начала main () небольшой фрагмент кода, который запрашивал общее количество блоки памяти, выделенные в куче, и затем запросить ее снова в самом конце функции main (), если два значения не совпадают, я сообщу об ошибке «утечка памяти из X байтов» в этой точке.

Если вы хотите сделать это, вы можете использовать GlobalMemoryStatuxEx или HeapWalk . Первый проще в использовании и быстрее, но более сырой, а второй более точный, но гораздо более обширный.

5 голосов
/ 20 апреля 2011

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

...