[英]Memory usage in C++ program, as reported by Gnome resource monitor: confusion
我正在查看我的应用程序消耗的内存,以确保我没有分配太多,并且对Gnome资源监视器向我显示的内容感到困惑。 我已经使用以下代码片段在两个相同的应用程序中分配内存; 它们只包含此代码和scanf()调用以暂停执行,同时我获取内存使用情况:
malloc(1024 * 1024 * 100);
和
char* p = new char[1204*1024*100];
下图显示了我的应用程序在每个行之前和之后的内存使用情况:
现在,我已经阅读了很多(但显然还不够)关于内存使用情况(包括这个 SO问题),并且无法区分可写内存和虚拟内存。 根据相关问题,
“可写内存是进程使用写权限分配的地址空间量”
和
“虚拟内存是应用程序分配的地址空间”
1)如果我自己分配了内存,肯定它有写权限吗?
2)链接的问题也说明(关于malloc)
“......实际上并没有分配任何内存。(有关详细信息,请参阅malloc(3)页面末尾的咆哮。)”
我没有看到任何“咆哮”了,我的图片显示了虚拟内存增加了 ! 有人可以解释一下吗?
3)如果我纯粹使用以下代码:
char* p = new char[100];
...资源监视器显示内存和可写内存都增加了8KB - 与我分配一个完整的1兆字节时相同! - 虚拟内存增加0.1。 这里发生了什么?
4)我应该在资源监视器中查看哪一列,以查看我的应用程序使用了多少内存?
非常感谢您提前参与,如果不清楚或错过了任何可能导致我自己找到答案的事情,那就很抱歉。
在Linux上理解正在运行的进程的内存使用情况的更精确的方法是使用proc(5)文件系统。
所以,如果您的流程pid是1234,请尝试
cat /proc/1234/maps
请注意,进程在虚拟内存中具有其地址空间 。 可以通过mmap(2)和其他系统调用(2)更改该地址空间。 出于几个效率原因, malloc(3)和free
可以避免过多地使用这些系统调用,并且更喜欢重新使用以前的free
-d内存区域。 因此,当你的程序是free
(或者,在C ++中, delete
)一些内存块时,该块通常被标记为可重用但不会被释放回内核(例如munmap
)。 同样,如果malloc
只有100个字节,则允许你的libc
使用mmap
请求整个兆字节(下次你调用malloc
例如200字节时,它将使用该magabyte的一部分)
另请参阅http://linuxatemyram.com/和高级Linux编程 (以及有关内存过量使用的问题 )
Gnome资源监视器(实际上是绝大多数资源报告工具)报告的内存类别不仅仅是单独的内存类别 - 它们之间存在重叠,因为它们报告了内存的不同特征。 其中一些不同的特征包括:
xterm
实例并不意味着xterm
的代码需要在内存中加载37次 - 所有进程可以共享代码的一个副本 由于这些以及一些其他因素(IPC共享内存,内存映射文件,具有映射到硬件中的内存区域的物理设备等),确定任何单个进程甚至整个系统使用的实际内存,可能很复杂。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.