c++ - C++ 程序中的内存使用情况,由 Gnome 资源监视器 : confusion 报告

标签 c++ linux memory-management gnome

我正在查看我的应用程序消耗的内存以确保我没有分配太多内存,并且对 Gnome 资源监视器向我显示的内容感到困惑。我使用以下代码片段在两个其他方面相同的独立应用程序中分配内存;它们只包含这段代码和一个 scanf() 调用以在我获取内存使用情况时暂停执行:

malloc(1024 * 1024 * 100);

char* p = new char[1204*1024*100];

下图显示了我的应用在每一行前后的内存使用情况:

Memory use

现在,我已经阅读了很多(但显然还不够)关于内存使用的内容(包括 this SO 问题),并且在区分可写内存和虚拟内存时遇到了困难。根据链接的问题,

"Writeable memory is the amount of address space that your process has allocated with write privileges"

"Virtual memory is the address space that your application has allocated"

1) 如果我自己分配了内存,它肯定有写权限吗?

2) 链接的问题还指出(关于 malloc)

"...which won't actually allocate any memory. (See the rant at the end of the malloc(3) page for details.)"

我没有看到任何“咆哮”,我的图像显示虚拟内存已经增加了!有人可以解释一下吗?

3) 如果我有纯粹的以下代码:

char* p = new char[100];

...资源监视器显示内存和可写内存都增加了 8KB - 与我分配完整的 1 兆字节时相同! - 虚拟内存增加 0.1。这里发生了什么?

4)我应该查看资源监视器中的哪一列以了解我的应用使用了多少内存?

非常感谢您的参与,如果我不清楚或遗漏任何可能导致我自己寻找答案的内容,我们深表歉意。

最佳答案

在 Linux 上了解正在运行的内存使用情况的更精确方法 process是使用proc(5)文件系统。

所以,如果你的进程pid是1234,试试

cat /proc/1234/maps

注意进程有它们的 address spacevirtual memory .该地址空间可以通过 mmap(2) 更改及其他syscalls(2) .出于几个效率原因 malloc(3)free 避免进行过多的这些系统调用,并且更愿意重新使用以前的 free-d 内存区域。因此,当您的程序free-ing(或者,在 C++ 中,delete-ing)一些内存块时,该 block 通常被标记为可重用但不会被释放回来到内核​​(例如通过 munmap)。同样,如果你的 malloc 只有 100 个字节,你的 libc 是允许的,例如使用 mmap 请求整个兆字节(下次您为例如 200 字节调用 malloc 时,它将使用该兆字节的一部分)

另见 http://linuxatemyram.com/Advanced Linux Programming (和 this question 关于内存过量使用)

关于c++ - C++ 程序中的内存使用情况,由 Gnome 资源监视器 : confusion 报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26408790/

相关文章:

java - Android - 释放分配的内存 AnimationDrawable 正在用完

linux - linux 上的 qt openGL 支持

c++ - 从命令提示符编译 BADA 应用程序

c++ - C++ 中的 fstream 错误

c++ - VS 2010 : Why the "Autos" window items appear\disappear in their visibility area?

python - 在 linux 上运行的 python 脚本中终止进程

在 SharedLibrary 中创建线程会引发段错误

linux - Linux 中共享库的内存映射

c - 包含 char 的 C 结构的大小

c++ - shared_ptr 的复制分配导致段错误?