【发布时间】:2014-10-16 15:54:17
【问题描述】:
我正在查看我的应用程序消耗的内存以确保我没有分配太多,并且对 Gnome 资源监视器向我显示的内容感到困惑。我使用以下代码在两个不同的应用程序中分配内存,这些应用程序在其他方面是相同的;它们只包含这段代码和一个 scanf() 调用以在我获取内存使用情况时暂停执行:
malloc(1024 * 1024 * 100);
和
char* p = new char[1204*1024*100];
下图显示了我的应用在每一行之前和之后的内存使用情况:
现在,我已经阅读了很多(但显然还不够)关于内存使用的内容(包括this SO 问题),并且在区分可写内存和虚拟内存时遇到了麻烦。根据链接的问题,
“可写内存是你的进程拥有的地址空间量 分配写权限”
和
“虚拟内存是你的应用程序拥有的地址空间 分配”
1) 如果我自己分配了内存,它肯定有写权限吗?
2) 链接的问题还指出(关于 malloc)
"...实际上不会分配任何内存。(请参阅最后的咆哮) malloc(3) 页面的详细信息。)"
我没有看到任何“咆哮”,我的图像显示虚拟内存已增加!有人可以解释一下吗?
3)如果我有纯以下代码:
char* p = new char[100];
...资源监视器显示内存和可写内存都增加了 8KB - 与我分配整整一兆字节时相同! - 虚拟内存增加 0.1。这里发生了什么?
4)我应该查看资源监视器中的哪一列来查看我的应用正在使用多少内存?
非常感谢您的参与,如果不清楚或错过任何可能导致我自己找到答案的内容,我们深表歉意。
【问题讨论】:
-
我不清楚您的问题是否完全重复,所以我没有关闭它。但是您可能缺少的技术术语是“过度使用”。使用
[C] overcommit在 SO 上搜索会显示很多结果。如果您还有更具体的问题,请四处看看,然后回来告诉我们。 -
那和“延迟分配”或“需求分配”...当您的应用程序“分配”更多内存时,Linux 往往只是将一些额外的虚拟地址空间标记为正在使用,而不实际分配物理内存填充该地址空间 - 当您第一次尝试访问新的虚拟地址时,实际分配会在稍后发生......
-
当你分配一小块内存时,内存管理器会分配一个更大的块,然后将它分割成小块返回给你的代码。你可能只是看到了。
-
触摸内存不会“将其从虚拟变为可写”——这是两个完全不同的特征。进程虚拟地址空间中映射的所有内存都是虚拟的。其中一些是可写的,一些是只读的,一些是可执行的。有些当前由真实的物理内存支持,有些则没有。有些可能已经被调出以交换空间,或者被文件支持等等......而且这一切都以页面大小为增量完成(因此 100 个字符需要 8KB)。
标签: c++ linux memory-management gnome