Visual Studio 什么是进程内存使用率?

m1m5dgzv  于 2022-11-17  发布在  其他
关注(0)|答案(2)|浏览(258)

我有一个在 Visual Studio 2017 中开发的32位应用程序,希望了解VS诊断工具中显示的进程内存使用情况。据我所知,我的应用程序的总内存使用量约为330 MB,但使用的堆大小仅为180 MB。
什么是使用剩余的内存150MB?
高进程内存使用率是否会影响应用程序性能?
如果是,如何减少进程内存使用?

fhg3lkii

fhg3lkii1#

当你讨论应用程序的内存空间时,你会考虑到很多事情,堆只是其中之一。
因为你已经提到了它,让我们从它开始。heap是一个动态分配的内存空间。如果你考虑像C/C++这样的低级语言,当你调用malloc(...)new Object(...)时,你在堆上分配内存,当你调用free(...)delete X时,你释放了堆的内存空间。
另外一个非常重要的内存段是堆栈。简单地说,这个内存段负责“管理”应用程序的执行流和存储局部变量。因为进程中的每个线程都有自己的执行流,所以操作系统确保每个线程都有自己的堆栈。Windows线程堆栈的默认大小是1 MB。
额外的内存被应用程序的额外段所占用。在此不做详细介绍,Windows应用程序是PE文件,您可以了解它们的格式herehere。当您编写代码时,有不同的内容最终会存储到二进制文件中。代码本身是最明显的组件,但不是唯一的组件。静态变量、其中一些是初始化的,而另一些则不是(为了避免混淆,我不详细介绍),它们也是二进制的一部分。
当您执行PE二进制档时,装载器会将所有这些区段载入已建立行程序的内存空间。随着时间的推移,应用程序会建立新的执行绪并配置更多的内存。
作为一个粗略的估计,我认为您的进程使用的内存量等于:堆+(线程计数 * 堆栈大小)+二进制大小
注意:我故意忽略了高级操作系统特性,如分页、惰性分配、private heaps等。

bjg7j2ky

bjg7j2ky2#

我的假设一直是,额外的内存是由系统依赖项消耗的,这些系统依赖项没有严格地包括在项目中,但却被进程使用。
此外,您还保留了分页内存,在Windows上,这将缓存所有类型的内存块,以供假定使用。
在我的经验中,为了最小化这种开销,最好的选择是保持函数的轻量级(和“功能性”),确保在不使用时处理堆/集合。
我希望这能有所帮助。

相关问题