我有一个 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++ 中的哪些操作会使虚拟内存膨胀这么多?
- 如果我的任务使用千兆虚拟内存,这会出现问题吗?
- 堆栈和堆函数变量、向量等 - 这些是否一定会增加物理内存的使用?
- 会消除内存泄漏(通过
delete
or free()
或类似)一定会减少物理和虚拟内存的使用?
虚拟内存是你的程序处理的事情。它由返回的所有地址组成malloc
, new
,等人。每个进程都有自己的虚拟地址空间。虚拟地址的使用理论上受到程序地址大小的限制:32位程序有4GB地址空间; 64 位程序的功能要多得多。实际上,进程可以分配的虚拟内存量小于这些限制。
物理内存芯片是焊接到主板上还是安装在内存插槽中。任何给定时间使用的物理内存量仅限于计算机中的物理内存量。
虚拟内存子系统将程序使用的虚拟地址映射到 CPU 发送到 RAM 芯片的物理地址。在任何特定时刻,您分配的大部分虚拟地址都未映射;因此,物理内存使用量低于虚拟内存使用量。如果您访问已分配但未映射的虚拟地址,操作系统会无形中分配物理内存并将其映射进去。当您不访问虚拟地址时,操作系统可能会取消物理内存的映射。
依次回答您的问题:
new
, malloc
,大数组的静态分配。通常,程序中需要内存的任何内容。
这取决于您的程序的使用模式。如果您分配了大量您从未接触过的内存,并且您的程序是 64 位程序,那么您使用千兆虚拟内存可能没问题。
此外,如果您的内存使用无限制地增长,您最终将耗尽某些资源。
- 堆栈和堆函数变量、向量等 - 这些是否一定会增加物理内存的使用?
不一定,但有可能。接触变量的行为至少暂时确保它(以及它“附近”的所有内存)位于物理内存中。 (旁白:像这样的容器std::vector
可以分配在堆栈或堆上,但是包含对象在堆上分配。)
- 消除内存泄漏(通过delete或free()等)一定会减少物理和虚拟内存的使用吗?
物理:可能。虚拟:是的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)