虚拟v.评估C/C++内存泄漏的物理内存

dje*_*lin 4 c++ memory ram memory-leaks virtual-memory

我有一个C++应用程序,我试图消除内存泄漏,我意识到我不完全理解虚拟和物理内存之间的区别.

结果top(所以16.8g =虚拟,111m =物理):

4406 um 20 0 16.8g 111m 4928 S 64.7 22.8 36:53.65 client

我的进程拥有500个连接,每个用户一个,这些数字意味着每个用户有大约30 MB的虚拟开销.没有进入我的应用程序的细节,这可能听起来远程逼真的唯一方法,将所有向量,结构,线程,函数堆叠在一起等,是我不知道虚拟内存实际意味着什么.没有-O优化标志,顺便说一句.

所以我的问题是:

  • C++中的哪些操作会如此夸大虚拟内存?
  • 如果我的任务是使用虚拟内存演出,这是一个问题吗?
  • 堆栈和堆函数变量,向量等 - 那些必然会增加物理内存的使用吗?
  • 删除内存泄漏(通过deletefree()等)必然会减少物理和虚拟内存使用量?

Rob*_*obᵩ 9

虚拟内存是您的程序处理的内容.它包括所有返回的地址的malloc,new等.每个进程都有自己的虚拟地址空间.虚拟地址的使用在理论上受程序地址大小的限制:32位程序有4GB的地址空间; 64位程序有更多.实际上,进程可以分配的虚拟内存量小于这些限制.

物理内存是焊接到主板或安装在内存插槽中的芯片.在任何给定时间使用的物理内存量仅限于计算机中的物理内存量.

虚拟内存子系统将程序使用的虚拟地址映射到CPU发送到RAM芯片的物理地址.在任何特定时刻,大多数分配的虚拟地址都是未映射的; 因此物理内存使用低于虚拟内存使用.如果访问已分配但未映射的虚拟地址,操作系统将无形地分配物理内存并将其映射.当您不访问虚拟地址时,操作系统可能会取消映射物理内存.

轮流提出问题:

  • C++中的哪些操作会如此夸大虚拟内存?

new,, malloc静态分配大型数组.通常在程序中需要内存的任何内容.

  • 如果我的任务是使用虚拟内存演出,这是一个问题吗?

这取决于您的程序的使用模式.如果您分配了永远不会触及的大量内存,并且如果您的程序是64位程序,那么您可能正在使用虚拟内存.

此外,如果您的内存使用不受限制地增长,您最终将耗尽一些资源.

  • 堆栈和堆函数变量,向量等 - 那些必然会增加物理内存的使用吗?

不一定,但可能.触摸变量的行为确保了(至少暂时地)它(以及所有"接近"它的存储器)在物理存储器中.(旁白:std::vector可以在堆栈或堆上分配容器,但是在堆上分配包含的对象.)

  • 删除内存泄漏(通过删除或free()等)必然会减少物理和虚拟内存使用量吗?

身体:可能.虚拟:是的.