我有一个在 Visual Studio 2017 中开发的32位应用程序,希望了解VS诊断工具中显示的进程内存使用情况。据我所知,我的应用程序的总内存使用量约为330 MB,但使用的堆大小仅为180 MB。什么是使用剩余的内存150MB?高进程内存使用率是否会影响应用程序性能?如果是,如何减少进程内存使用?
fhg3lkii1#
当你讨论应用程序的内存空间时,你会考虑到很多事情,堆只是其中之一。因为你已经提到了它,让我们从它开始。heap是一个动态分配的内存空间。如果你考虑像C/C++这样的低级语言,当你调用malloc(...)或new Object(...)时,你在堆上分配内存,当你调用free(...)或delete X时,你释放了堆的内存空间。另外一个非常重要的内存段是堆栈。简单地说,这个内存段负责“管理”应用程序的执行流和存储局部变量。因为进程中的每个线程都有自己的执行流,所以操作系统确保每个线程都有自己的堆栈。Windows线程堆栈的默认大小是1 MB。额外的内存被应用程序的额外段所占用。在此不做详细介绍,Windows应用程序是PE文件,您可以了解它们的格式here和here。当您编写代码时,有不同的内容最终会存储到二进制文件中。代码本身是最明显的组件,但不是唯一的组件。静态变量、其中一些是初始化的,而另一些则不是(为了避免混淆,我不详细介绍),它们也是二进制的一部分。当您执行PE二进制档时,装载器会将所有这些区段载入已建立行程序的内存空间。随着时间的推移,应用程序会建立新的执行绪并配置更多的内存。作为一个粗略的估计,我认为您的进程使用的内存量等于:堆+(线程计数 * 堆栈大小)+二进制大小注意:我故意忽略了高级操作系统特性,如分页、惰性分配、private heaps等。
malloc(...)
new Object(...)
free(...)
delete X
bjg7j2ky2#
我的假设一直是,额外的内存是由系统依赖项消耗的,这些系统依赖项没有严格地包括在项目中,但却被进程使用。此外,您还保留了分页内存,在Windows上,这将缓存所有类型的内存块,以供假定使用。在我的经验中,为了最小化这种开销,最好的选择是保持函数的轻量级(和“功能性”),确保在不使用时处理堆/集合。我希望这能有所帮助。
2条答案
按热度按时间fhg3lkii1#
当你讨论应用程序的内存空间时,你会考虑到很多事情,堆只是其中之一。
因为你已经提到了它,让我们从它开始。heap是一个动态分配的内存空间。如果你考虑像C/C++这样的低级语言,当你调用
malloc(...)
或new Object(...)
时,你在堆上分配内存,当你调用free(...)
或delete X
时,你释放了堆的内存空间。另外一个非常重要的内存段是堆栈。简单地说,这个内存段负责“管理”应用程序的执行流和存储局部变量。因为进程中的每个线程都有自己的执行流,所以操作系统确保每个线程都有自己的堆栈。Windows线程堆栈的默认大小是1 MB。
额外的内存被应用程序的额外段所占用。在此不做详细介绍,Windows应用程序是PE文件,您可以了解它们的格式here和here。当您编写代码时,有不同的内容最终会存储到二进制文件中。代码本身是最明显的组件,但不是唯一的组件。静态变量、其中一些是初始化的,而另一些则不是(为了避免混淆,我不详细介绍),它们也是二进制的一部分。
当您执行PE二进制档时,装载器会将所有这些区段载入已建立行程序的内存空间。随着时间的推移,应用程序会建立新的执行绪并配置更多的内存。
作为一个粗略的估计,我认为您的进程使用的内存量等于:堆+(线程计数 * 堆栈大小)+二进制大小
注意:我故意忽略了高级操作系统特性,如分页、惰性分配、private heaps等。
bjg7j2ky2#
我的假设一直是,额外的内存是由系统依赖项消耗的,这些系统依赖项没有严格地包括在项目中,但却被进程使用。
此外,您还保留了分页内存,在Windows上,这将缓存所有类型的内存块,以供假定使用。
在我的经验中,为了最小化这种开销,最好的选择是保持函数的轻量级(和“功能性”),确保在不使用时处理堆/集合。
我希望这能有所帮助。