Что такое использование памяти процесса?

У меня есть 32-разрядное приложение, разработанное в Visual Studio 2017, и я хотел бы понять, что такое использование памяти процесса, как показано в средствах диагностики VS. Насколько я понимаю, общее использование памяти моего приложения составляет около 330 МБ, но размер используемой кучи составляет всего 180 МБ.

Для чего используется оставшаяся память 150 МБ?
Влияет ли интенсивное использование памяти на производительность приложений?
Если да, как я могу уменьшить использование памяти процесса?

2 ответа

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

Поскольку вы уже упомянули об этом, давайте начнем с него. Куча — это динамически выделяемое пространство памяти. Если вы рассматриваете языки низкого уровня, такие как C/C++, когда вы вызываете malloc(...)или же new Object(...), вы выделяете память в куче, когда вы free(...)или же delete X, вы освобождаете место в куче памяти.

Дополнительным, очень значимым сегментом памяти является стек . Для упрощения этот сегмент памяти отвечает за «управление» потоком выполнения нашего приложения и хранение локальных переменных. Поскольку каждый поток в нашем процессе имеет свой собственный поток выполнения, операционная система следит за тем, чтобы у каждого потока был свой собственный стек. Размер стека потоков Windows по умолчанию составляет 1 МБ.

Дополнительную память занимают дополнительные сегменты приложения. Не вдаваясь в подробности, приложения Windows представляют собой PE-файлы, и вы можете прочитать об их формате здесь и здесь . Когда вы пишете свой код, есть разные вещи, которые в конечном итоге сохраняются в двоичном файле. Сам код является наиболее очевидным компонентом, но не единственным. Статические переменные, некоторые из которых инициализируются, а некоторые нет (я не буду вдаваться в подробности, чтобы избежать путаницы), также являются частью двоичного файла.

Когда вы запускаете двоичный файл PE, загрузчик загружает все эти разделы в пространство памяти созданного процесса. Со временем приложение создает новые потоки и выделяет больше памяти.

В качестве грубой и грубой оценки я бы сказал, что объем памяти, который использует ваш процесс, равен: куча + (количество потоков * размер стека) + размер двоичного файла.

ПРИМЕЧАНИЕ. Я намеренно игнорирую расширенные функции ОС, такие как пейджинг , отложенное выделение , частные кучи и т. д.

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

Кроме того, у вас также есть зарезервированная память подкачки, в Windows это будет кэшировать все виды блоков памяти для предполагаемого использования.

По моему опыту, чтобы свести к минимуму эти накладные расходы, лучшим вариантом является сохранение функций легкими (и «функциональными»), убедившись, что вы избавляетесь от куч/коллекций, когда они не используются.

Я надеюсь, что это поможет.

Другие вопросы по тегам