繁体   English   中英

为什么内存没有在top和pmap中释放?

[英]Why the memory not freed in top and pmap?

我已经用valgrind检查了代码,没有内存泄漏。 但我使用“ top”查看内存,调用“ delete”后它消耗了295MB内存。
我使用'pmap -x'来查看内存,大部分内存消耗是[anon]:

Address           Kbytes     RSS   Dirty Mode   Mapping
0000000001114000  301672  301588  301588 rw---    [ anon ]

我不知道为什么要释放内存,但是它仍然需要295MB。 有人知道为什么吗?

#include <map>
#include <string>
#include <iostream>
#include <stdio.h>
using namespace std;
void test8() {
  map<string, map<string,string>* > m;
  for (int i = 1; i < 10000; i++) {
    map<string, string>* p = new map<string, string>();
    for (int j = 1; j < 100; j++) {
      (*p)[string(j,'a')] = string(j,'a');
    }
    m[string(i,'a')] = p;
  }

  map<string, map<string,string>* >::iterator it;
  for (it = m.begin(); it != m.end(); it++) {
    it->second->clear();
    delete it->second;
  }
  m.clear();
  cout << "free done" << endl;
}
int main(int argc, char**argv) {
  test8();
  getchar();
}

您正在使用的工具正在监视操作系统中进程分配的内存,而不正在监视C ++程序中当前活动的内存分配的大小。

当您用C ++代码分配内存时,它很可能必须转到操作系统并要求更多。 这将增加您正在监视的值。

然而,当你释放它,有没有要求 ,它给内存操作系统,因为它可能再次需要它很快。

因此,即使您的C ++程序已释放内存,C ++ 环境仍会保留该内存,以防您再次需要它。

它是特定于操作系统的,但是通常,一旦进程获取了内存,它就会保留它。 您可能没有使用内存,但是该内存可用于您的进程(在空闲池中)。

缓存,缓存,缓存。 哦,是的,而且支离破碎。

内存是通过不同的层分配的。 如果您的应用程序分配了内存,它将向C / C ++运行时请求内存。 C / C ++运行时将检查其自己的数据结构中是否有可用内存,如果没有,则会将调用转发给OS。 根据C / C ++运行时(和版本)的不同,C / C ++运行时的数据结构可能会很广泛,或者C / C ++运行时可能只是始终将调用直接转发给OS。 对于Microsoft Visual Studio(目前不使用Linux,抱歉),我知道:

  • 较旧的版本在C / C ++运行时中具有相当广泛的内存数据结构
  • 较新的版本似乎总是将呼叫转发给操作系统(Windows Heap)

这意味着在释放内存时,C / C ++运行时可能会决定保留内存(出于多种原因,包括如果您决定再次分配内存,则能够更快地返回内存),或者可能会将其返回给操作系统(如果已经存在)有很多可用内存)。 操作系统可能完全相同:要准备再次分配内存,请准备好内存,或者将其标记为立即释放。

哦,是的,碎片。 内存通常分为几页。 在Intel x86和amd64上,页面为4KB。 每个页面包含一些信息,包括:

  • 保护权限(只读,读写,执行(请参阅DEP,NoX位)
  • 它的实际位置(物理内存,分页到页面文件中,...)

假设您的应用程序分配了16乘256字节,并且您很幸运地将所有这些内存分配在4KB的一页内。 如果现在释放这些分配中的15个,则第16个分配将保留已分配的内存页,从而防止OS将其标记为已释放。 编写一个分配了1.5GB的应用程序,然后释放它的1.4GB并仍然消耗1.5GB的内存(根据操作系统)是很容易的。

这意味着,即使您重新分配了所有内存,即使您重新分配了所有内存,也可能只有一些内部C / C ++运行时数据结构或某些第三方数据结构(可能是某些缓存)可以分配一些页面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM