Перейти к содержимому

Как узнать сколько памяти занимает программа c

  • автор:

Как измерить количество используемой памяти

Навеяно вот этим ответом. Вдруг сообразил, что померить производительность программы я знаю как, а вот как определить, сколько ей требуется памяти — что-то у меня пробелы в образовании 🙂 Перехватывать new и delete ? сомнительно, не очень верится, что все будет работать только через эти операторы. Словом, никто не подскажет, как все-таки лучше, надежнее и точнее всего это делать, причем желательно не извне, а из самой программы? Конкретнее — Windows, использую Visual C++ 2017.

Отслеживать
задан 18 дек 2019 в 17:00
219k 15 15 золотых знаков 119 119 серебряных знаков 230 230 бронзовых знаков
А вы уже видели подобный вопрос на SO (En)?
18 дек 2019 в 17:37
@ВЛ80 Нет, не видел.
18 дек 2019 в 17:47

Как посмотреть затрачиваемые ресурсы программы? сообщала о самых разнообразных ошибках — ошибки в студию

18 дек 2019 в 17:50

@user7860670 Уже завтра, сегодня голова уже не варит. Тот проект я уже прибил, заводиться с нуля сейчас не хочу.

18 дек 2019 в 17:59

Использую VS2015 pro, в отладчике есть отличная штука — Diagnostic Tools, которая позволяет снять снепшот памяти и проанализировать, чего и в каких количествах в ней выделялось. (Подозреваю, что VS2017 должна обладать этой тулзой тоже — в отладчике меню Debug->Windows->Show Diagnostic Tools)

19 дек 2019 в 4:11

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Для получения информации о памяти процесса есть несколько API, наиболее интересны из них:

  • Функция GetProcessMemoryInfo
  • Счетчики производительности
  • Функция HeapSummary
#include #include #include #include "pdh.h" #pragma comment( lib, "Pdh.lib" ) long GetPrivateWorkingSet(const wchar_t* process) < PDH_HQUERY query; PDH_HCOUNTER counter; PDH_FMT_COUNTERVALUE counterVal; const wchar_t* name = L"\\Process(%s)\\Working Set - Private"; wchar_t buf[1024]=L""; swprintf_s(buf, 1024, name, process); PdhOpenQuery(NULL, NULL, &query); PDH_STATUS res = PdhAddEnglishCounter(query, buf, NULL, &counter); res = PdhCollectQueryData(query); PdhGetFormattedCounterValue(counter, PDH_FMT_LONG, NULL, &counterVal); long ret = counterVal.longValue; PdhCloseQuery(query); return ret; >void PrintMemory() < PROCESS_MEMORY_COUNTERS_EX pmc; GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc)); printf("Private committed memory: %u B\nWorking set: %u B\n", (UINT)pmc.PrivateUsage, (UINT)pmc.WorkingSetSize); printf("Private working set: %u B\n", (UINT)GetPrivateWorkingSet(L"Program")); HANDLE heaps[20]; HEAP_SUMMARY hs; DWORD cHeaps = GetProcessHeaps(20, heaps); for (DWORD i = 0; i < cHeaps; i++) < memset(&hs, 0, sizeof(hs)); hs.cb = sizeof(hs); if (HeapSummary(heaps[i], 0, &hs) == FALSE) printf("HeapSummary failed"); printf("Heap #%u size: %u B\n", (UINT)i, (UINT)hs.cbAllocated); >printf("\n"); > int main() < //первый запуск нужен для прогрева, т.е чтобы инициализировать внутренние структуры API //(так как API счетчиков производительности сам выделяет память при первом запуске) PrintMemory(); //второй запуск, соответственно, дает достоверные значения PrintMemory(); getchar(); >

Показатели, которые я здесь использую:

Private committed memory (Частная выделенная память) — объем виртуальной памяти процесса в состоянии MEM_COMMIT, принадлежащей исключительно этому процессу. Состояние MEM_COMMIT значит, что под данную память выделено место в файле подкачки, а в физической памяти оно может быть либо выделено, либо нет. Из данного значения исключена память, которая является разделяемой между разными процессами — отображенные на память файлы и загруженные DLL, отсюда «private». Звучит сложно, но по сути это и есть главный показатель, сколько процесс «жрет» памяти.

Working set (Рабочий набор) — общий объем физической памяти, выделенной процессу, в том числе разделяемой между несколькими процессами.

Private working set (Частный рабочий набор) — объем физической памяти, принадлежащей исключительно данному процессу. Этот показатель более полезен, чем предыдущий, но получить его сложнее.

Heap size — объем выделенной динамической памяти (помимо непосредственно выделенного нами через new , включает также то, что выделено внутренне библиотеками).

Какой из этих показателей использовать, сильно зависит от ситуации. Если речь о спортивном программировании и ограничении количества используемой памяти на решение задачи, интересен Private committed memory. Если же речь идет об оценке нагрузки на систему, важнее показатели физической памяти, так как она более дефицитна, чем место в файле подкачки.

Измерение использования памяти в Visual Studio (C#, Visual Basic, C++, F#)

Область применения:yesVisual Studio Visual Studio для Mac noVisual Studio Code no

С помощью встроенного в отладчик средства диагностики Использование памяти вы сможете находить утечки памяти и выявлять ее неэффективное использование. С помощью средства «Использование памяти» можно сделать один или несколько снимков управляемой и собственной памяти в куче, чтобы понять влияние использования памяти типов объектов. Анализировать использование памяти также можно без подключения отладчика — нужно просто указать выполняющееся приложение. Дополнительные сведения см. в разделе Запуск средств профилирования с отладчиком или без него. Сведения о выборе необходимого средства анализа памяти см. в разделе Выбор инструмента для анализа памяти.

Хотя с помощью средства Использование памяти можно делать снимки памяти в любой момент, для управления выполнением приложения во время анализа ошибок производительности вы можете использовать отладчик Visual Studio. Задание точек останова, пошаговое выполнение, всеобщее прерывание и другие действия отладчика могут помочь вам сосредоточиться на анализе производительности при обращении к наиболее важным ветвям кода. Выполняя эти действия, когда приложение запущено, вы сможете исключить влияние не интересующего вас кода и значительно ускорить диагностику проблем.

Средства диагностики, интегрированные в отладчик, поддерживаются для разработки приложений .NET в Visual Studio, включая ASP.NET и ASP.NET Core, машинного кода или кода C++ и смешанных программ (на основе .NET и машинного кода). Для запуска средств профилирования с отладчиком (окно Средства диагностики) требуется Windows 8 и более поздние версии.

При работе с этим руководством вы сделаете следующее:

  • Создание моментальных снимков с данными об использовании памяти
  • Анализ данных использования памяти

Если средство Использование памяти не предоставляет необходимые данные, можно воспользоваться другими средствами профилирования в Профилировщике производительности, предоставляющими другие виды информации, которая может оказаться полезной. Как правило, проблемы производительности приложения могут вызываться другими компонентами помимо памяти, такими как ЦП, отрисовка пользовательского интерфейса или время запроса сети.

Поддержка пользовательского распределителя. Профилировщик внутренней памяти работает путем сбора данных событий ETW выделения памяти, создаваемых во время выполнения. Распределители в CRT и пакете Windows SDK аннотированы на уровне исходного кода, что позволяет регистрировать их данные выделения. Если вы создаете собственные распределители, любые функции, возвращающие указатель на только что выделенную память в куче, можно декорировать с использованием __declspec(allocator), как показано в этом примере для myMalloc:

__declspec(allocator) void* myMalloc(size_t size)

Сбор данных об использовании памяти

  1. Откройте проект для отладки в Visual Studio и установите точку останова в приложении в точке, где вы хотите начать проверку использования памяти. Если вы подозреваете, что в определенной области памяти может возникнуть проблема, задайте первую точку останова до ее возникновения.

Совет Так как из-за изменений в объеме выделяемой памяти создание профиля памяти для интересующей вас операции может быть затруднительно, разместите точки останова в начале и в конце операции или пройдите по ней, чтобы попробовать найти точку, в которой объем памяти изменился.

Screenshot of Diagnostics Tools.

Screenshot of Diagnostics Tools.

Screenshot of Diagnostics Tools Summary Tab.

Screenshot of Enable snapshots.

Примечание. Поскольку сбор данных об использовании памяти может повлиять на производительность отладки приложений, основанных на машинном коде, а также смешанных программ, по умолчанию снимки памяти выключены. Чтобы включить моментальные снимки для приложений на базе машинного кода или для смешанных программ, начните сеанс отладки (клавиша F5). Когда отобразится окно Средства диагностики, перейдите на вкладку Использование памяти и выберите Профилирование кучи. Остановите (сочетание клавиш: SHIFT+F5) и перезапустите отладку.

Screenshot of Diagnostics Tools Summary Tab.

Screenshot of Enable snapshots.

Примечание. Поскольку сбор данных об использовании памяти может повлиять на производительность отладки приложений, основанных на машинном коде, а также смешанных программ, по умолчанию снимки памяти выключены. Чтобы включить моментальные снимки для приложений на базе машинного кода или для смешанных программ, начните сеанс отладки (клавиша F5). Когда отобразится окно Средства диагностики, перейдите на вкладку Использование памяти и выберите Профилирование кучи. Остановите (сочетание клавиш: SHIFT+F5) и перезапустите отладку.

Screenshot of Take Snapshot button.

Screenshot of Take Snapshot button.

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

Анализ данных использования памяти

Строки сводной таблицы использования памяти содержат моментальные снимки, сделанные во время сеанса отладки, и содержат ссылки на более подробные представления.

Screenshot of Memory Usage table.

Screenshot of Memory Usage table.

Имя столбца зависит от режима отладки, выбранного в свойствах проекта: .NET, native или mixed (как .NET, так и в собственном коде).

  • В столбцах Объекты (разн.) и Выделения (разл.) указывается число объектов в .NET и внутренней памяти на момент создания моментального снимка.
  • В столбце Размер кучи (разн.) указывается число байтов в куче .NET и в собственных кучах.

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

Чтобы выполнить анализ данных об использовании памяти, щелкните одну из ссылок, которая позволяет открыть подробный отчет об использовании памяти:

Memory Usage Increase

  • Чтобы просмотреть сведения о разнице между текущим моментальным снимком и предыдущим моментальным снимком, выберите ссылку изменения слева от стрелки (). Красная стрелка обозначает, что объем используемой памяти увеличился, а зеленая — что он снизился.

Чтобы быстрее выявить проблемы с памятью, типы объектов в отчетах об изменениях можно отсортировать по наибольшему увеличению общего объема (щелкните ссылку «Изменения» в столбце Объекты (разн.)) или по наибольшему увеличению размера кучи (щелкните ссылку «Изменения» в столбце Размер кучи (разн.)).

  • Чтобы отобразить подробности только для выбранного моментального снимка, щелкните ссылку «Без изменений». Отчет отображается в новом окне.

Отчеты об управляемых типах

Щелкните текущую ссылку в ячейке Объекты (разн.) или Выделения (разн.) в сводной таблице «Использование памяти».

Screenshot of managed type report.

Screenshot of managed type report.

В верхней области показываются число и размер типов, зарегистрированных снимком, включая размер всех объектов, на которые ссылаются типы (Инклюзивный размер).

В дереве Пути к корню в нижней области отображаются объекты, на которые ссылается тип, выбранный в верхней области. Сборщик мусора .NET очищает память для объекта только при освобождении последнего типа, ссылавшегося на него.

В дереве Объекты, на которые указывает ссылка отображаются ссылки, активные для выбранного в верхней области типа.

Screenshot of Referenced Objects report.

В дереве Типы, на которые указывает ссылка отображаются ссылки, активные для выбранного в верхней области типа.

Screenshot of Referenced Objects report.

Чтобы отобразить экземпляры типа, выбранного в верхней области, нажмите кнопку «Просмотреть экземпляры» рядом с типом объекта.

Screenshot of the Instances view in the Memory Usage tool.

Screenshot of the Instances view in the Memory Usage tool.

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

Отчеты о собственных типах

Щелкните текущую ссылку в ячейке Выделения (разн.) или Размер кучи (разн.) в сводной таблице «Использование памяти», отображаемой в окне Средства диагностики.

Screenshot of Native Type View.

Screenshot of Native Type View.

В режиме Представление типов отображается число и размер типов, зарегистрированных снимком.

  • Выберите значок экземпляров (The instance icon in the Object Type column) выбранного типа, чтобы отобразить сведения об объектах выбранного типа в моментальном снимке. В окне Экземпляры отображаются все экземпляры выбранного типа. При выборе экземпляра на панели Стек вызовов выделений отображается стек вызовов, использованный для создания этого экземпляра. Screenshot of the Instances view and Allocation Call Stack pane.

Screenshot of the Instances view and Allocation Call Stack pane.

  • Чтобы отобразить информацию об объектах выбранного типа, зарегистрированных снимком, выберите Просмотреть экземпляры рядом с выбранным типом. В окне Экземпляры отображаются все экземпляры выбранного типа. При выборе экземпляра на панели Стек вызовов выделений отображается стек вызовов, использованный для создания этого экземпляра.

Screenshot of Stacks view.

  • Чтобы отобразить стек вызовов для выбранного типа, в раскрывающемся меню Режим просмотра выберите пункт Представление стеков .

Screenshot of Stacks view.

  • Чтобы отобразить стек выделений для выбранного типа, выберите Стеки.

Использование памяти Аналитика

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

Screenshot of the insight view in the Memory Usage tool.

В разделе «Повторяющиеся строки» отображается список строк, которые выделяются несколько раз в куче. Кроме того, в этом разделе показан общий объем пустой памяти, то есть (число экземпляров — 1) раз размер строки.

В разделе «Разреженные массивы» показаны массивы, которые в основном заполнены нулевыми элементами, которые могут быть неэффективными с точки зрения производительности и использования памяти. Средство анализа памяти автоматически обнаруживает эти массивы и показывает, сколько памяти тратится из-за этих нулевых значений.

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

Screenshot of the native insight view in the Memory Usage tool.

Отчеты об изменениях

  • В окне Средства диагностики щелкните в необходимой ячейке сводной таблицы Использование памяти разницу в значениях.

Screenshot of Choose a change link in a cell.

Screenshot of Choose a change link in a cell.

Screenshot of Choose a snapshot from the Compare To list.

Screenshot of Choose a snapshot from the Compare with list.

С помощью отчета об изменениях в основной отчет можно добавить столбцы, помеченные надписью (Разн.), в которых будет отображаться разница между двумя выбранными снимками. Отчет об изменениях собственных типов может выглядеть следующим образом.

Screenshot of Native Types Diff View.

Screenshot of Native Types Diff View.

Блоги и видео

Следующие шаги

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

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

Как узнать сколько памяти занимает программа c

Информацию по использованию оперативной памяти процессами в операционной системе Linux вы можете получить, подключившись к оболочке (shell) операционной системы.
Доступ к оболочке операционной системы возможен через веб-консоль используемой услуги или через подключение к виртуальной машине по SSH.

В операционной системе Linux выполните следующую команду:
ps -AH -o pid,size,command | sort -rn -k2

Результат выполнения команды представлен на следующем скриншоте.

Информация в выводе уже отсортирована по второму столбцу (потреблению оперативной памяти).
Дополнительная информация по выводу команды:
1-ый столбец — PID, идентификатор процесса;
2-ой столбец — SIZE, потребление оперативной памяти, КБ;
3-ий столбец — COMMAND, имя процесса или команда запуска процесса.

Узнать общую информацию по использованию оперативной памяти на виртуальной машине вы можете с помощью команды:
free -h

Результат выполнения команды представлен на следующем скриншоте.

Дополнительная информация по выводу команды:
— в выводе представлена информация по оперативной памяти (Mem) и разделу подкачки (Swap);
— в столбце total указана информация об общем размере памяти, доступном операционной системе.
— в столбце used указана информация о размере используемой памяти, за исключением свободной (free) и используемой под буфер и кэш (buff/cache);
— в столбце free указана информация о размере доступной (неиспользуемой) памяти.
— в столбце shared указана информация о размере памяти, используемой под храение разделяемой памяти (shared memory) и tmpfs.
— в столбце buff/cache указана информация о размере памяти, используемом буфферами и кэшем операционной системы и запущенных процессов;
— в столбце available указана информация о размере памяти, доступном для использования.

1.png (80.46 КБ)
2.png (8.19 КБ)

Если решение вопроса найти не удалось, Вы можете отправить нам заявку:

Как узнать сколько памяти занимает программа c

Пользователь

Регистрация: 21.10.2008

Сообщений: 37

Как узнать сколько RAM хавает процесс

Всем привет!
Как под линухом програмно узнать сколько места занимает процесс в оперативной памяти? или подскажите где можно почитать про это, весь инет облазил

Студент 1 курса

Форумчанин Подтвердите свой е-майл

Регистрация: 27.06.2008

Сообщений: 959

ps aux | grep processname

C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer

Пользователь

Регистрация: 21.10.2008

Сообщений: 37

ps aux | grep processname

я имел ввиду как с помощью средств c++ это узнать

Последний раз редактировалось WOWka777; 01.02.2011 в 15:52 .

Участник клуба

Регистрация: 29.10.2009

Сообщений: 1,456

тебе дали команду. её можно использовать и в с++

#include #include #include // вроде так называется int main() < int ram_count; system("ps aux | grep processname >ramproc.txt"); ifstream f; f.open("ramproc.txt"); f >> ram_count; std::cout

Последний раз редактировалось NiCola999; 01.02.2011 в 16:23 .

Регистрация: 03.01.2011

Сообщений: 2,508

Странно, что kernel ещё не предложили пересобрать

#include #include #include #include #include ////////////////////////////////////////////////////////////////////////////// // // process_mem_usage(double &, double &) - takes two doubles by reference, // attempts to read the system-dependent data for a process' virtual memory // size and resident set size, and return the results in KB. // // On failure, returns 0.0, 0.0 void process_mem_usage(double& vm_usage, double& resident_set) < using std::ios_base; using std::ifstream; using std::string; vm_usage = 0.0; resident_set = 0.0; // 'file' stat seems to give the most reliable results // ifstream stat_stream("/proc/self/stat",ios_base::in); // dummy vars for leading entries in stat that we don't care about // string pid, comm, state, ppid, pgrp, session, tty_nr; string tpgid, flags, minflt, cminflt, majflt, cmajflt; string utime, stime, cutime, cstime, priority, nice; string O, itrealvalue, starttime; // the two fields we want // unsigned long vsize; long rss; stat_stream >> pid >> comm >> state >> ppid >> pgrp >> session >> tty_nr >> tpgid >> flags >> minflt >> cminflt >> majflt >> cmajflt >> utime >> stime >> cutime >> cstime >> priority >> nice >> O >> itrealvalue >> starttime >> vsize >> rss; // don't care about the rest long page_size_kb = sysconf(_SC_PAGE_SIZE) / 1024; // in case x86-64 is configured to use 2MB pages vm_usage = vsize / 1024.0; resident_set = rss * page_size_kb; > int main()

«Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего.»

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *