什么是进程内存使用情况?

tom*_*myk 10 memory memory-management visual-studio diagnostic-tools

我有一个在Visual Studio 2017中开发的 32 位应用程序,想了解 VS 诊断工具中显示的进程内存使用情况。据我了解,我的应用程序的总内存使用量约为 330 MB,但使用的堆大小仅为 180 MB。

剩余的 150 MB 内存用于做什么?
高进程内存使用率是否会影响应用程序性能?
如果是,如何减少进程内存使用?

在此输入图像描述

Dan*_*man 0

当您讨论应用程序的内存空间时,您会考虑很多因素,而堆只是其中之一。

因为你已经提到了,所以让我们开始吧。堆是动态分配的内存空间如果您考虑像 C/C++ 这样的低级语言,当您调用malloc(...)或 时new Object(...),您会在堆上分配内存,当您free(...)调用 或 时delete X,您会释放堆内存空间。

另一个非常重要的内存段是堆栈。简单来说,该内存段负责“管理”应用程序的执行流程并存储局部变量。因为进程中的每个线程都有自己的执行流程,所以操作系统确保每个线程都有自己的堆栈。Windows 线程堆栈的默认大小为 1MB。

额外的内存被应用程序的额外段占用。无需详细介绍,Windows 应用程序是 PE 文件,您可以在此处此处阅读有关其格式的信息。当您编写代码时,最终会存储到二进制文件中的不同内容。代码本身是最明显的组件,但不是唯一的组件。静态变量,其中一些已初始化,另一些则未初始化(为了避免混淆,我不会详细介绍)也是二进制文件的一部分。

当您运行 PE 二进制文件时,加载程序会将所有这些部分加载到所创建进程的内存空间中。随着时间的推移,应用程序会创建新线程并分配更多内存。

作为粗略的估计,我想说您的进程使用的内存量等于:堆 + (线程数 * 堆栈大小) + 二进制大小

注意:我故意忽略高级操作系统功能,例如分页惰性分配私有堆等。