我一直在调查Red Hat Enterprise Linux 6上的客户问题。我也在Ubuntu上看到了类似的行为。客户通过输出跟踪内存使用情况 的/ proc /自/状态
在使用特定ODBC驱动程序时,在ODBC应用程序中会发生这种情况,但我怀疑这与问题有关。
在程序的各个阶段跟踪内存使用情况(通过调用/ proc / self / status函数粘贴在程序的各个阶段),一次在堆上分配一些内存,一次在释放内存后,一次在卸载后动态库。
当分配的内存量超过某个值时,VmRSS在释放内存后不会立即关闭,但在卸载so文件后会立即关闭。当分配的内存量很小时,VmRSS在释放内存后立即关闭。
我在应用程序上运行了valgrind,但是我找不到任何内存泄漏。 任何帮助,解释,文章指针都非常感谢。
void print_proc_status_vm()
{
std::ifstream proc_status_fhandle;
proc_status_fhandle.open("/proc/self/status");
std::string s;
int line=0;
static std::map<std::string, int> memoryUsage;
while(std::getline(proc_status_fhandle, s)){
++line;
if( (line >=12) and (line <=17 ) and (line !=14) )
{
char* str = new char[s.size()+1];
strcpy(str, s.c_str());
std::string key(strtok(str, "\t "));
int value = atoi(strtok(NULL, "\t "));
printf("%s %d \n", key.c_str(), value - memoryUsage[key] );
memoryUsage[key] = value;
delete[] str;
}
}
}
答案 0 :(得分:0)
一旦我在suricata上遇到了类似的问题-该程序将很多小规则加载到内存中,并且开发人员添加了动态重载规则后,该程序最终将不断占用两倍的内存,即使所有加载新规则后,先前的规则将被释放。
这是因为有很多规则,每个规则一个malloc,但是每个规则占用的空间不很多=> malloc内部使用了brk / sbrk(类似于堆栈),而不是原来的mmap =>规则在数据段上低于新规则,即使释放了千兆字节的原始规则,该段也没有减少。
在这种情况下,解决方案是立即分配一大块内存,然后手动将其拆分成较小的块。
对于文件,它是映射文件,因此可以在取消映射后立即释放内存。