Linux getrusage()maxrss最大常驻集大小不随分配而增加(C ++)

时间:2018-07-11 17:41:34

标签: c++ linux memory getrusage

我正在尝试使用getrusage(.)和最大驻留集大小(maxrss)检查内存泄漏。但是,当我故意创建泄漏时,maxrss不会改变。也许我对maxrss的理解不够深入。这是代码:

#include <iostream>
#include <sys/time.h>
#include <sys/resource.h>
using namespace std;
int main() {
  struct rusage r_usage;
  getrusage(RUSAGE_SELF, &r_usage);
  cout << r_usage.ru_maxrss << "kb\n";
  cout << "Allocating...\n";
  int a = 100000; // have tried range of numbers
  int* memleaktest = new int[a]; // class member
  if(!memleaktest)
    cout << "Allocation failed";
  getrusage(RUSAGE_SELF, &r_usage);
  cout << "after allocation " << r_usage.ru_maxrss << "kb\n";
  return 0;
}

分配分配后,我得到的值完全相同(〜15000kb)。 在Ubuntu x86上。

2 个答案:

答案 0 :(得分:2)

直到您访问它,分配的内存才真正被映射。 如果您用值initialize数组,Linux将被迫实际分配和映射新页面:

#include <iostream>
#include <sys/time.h>
#include <sys/resource.h>
using namespace std;
int main() {
  struct rusage r_usage;
  getrusage(RUSAGE_SELF, &r_usage);
  cout << r_usage.ru_maxrss << "kb\n";
  cout << "Allocating...\n";
  int a = 1000000;                 // Sufficiently large
  int* memleaktest = new int[a](); // Initialized to zero
  if(!memleaktest)
    cout << "Allocation failed";
  getrusage(RUSAGE_SELF, &r_usage);
  cout << "after allocation " << r_usage.ru_maxrss << "kb\n";
  return 0;
}

在我的系统上,结果为:

4900kb
Allocating...
after allocation 6844kb

请注意,编译器优化可能会决定未使用数组或应将其分配在前面,因此更喜欢在没有数组的情况下进行编译,或者以无法优化的方式重写测试用例。

答案 1 :(得分:0)

由于性能问题,操作系统(OS)以块的形式分配资源,而不是每个应用程序请求都是一个新资源。因此,当应用程序中释放了一块内存时,操作系统可能仍会保留其所属的块。

为什么?考虑一个请求1G不同1字节内存块的应用程序。操作系统必须跟踪所有这些,这意味着内存总量为1G加上2G * sizeof(pair)来存储对{begin,size}来标识每个内存块。

如果要检测内存泄漏,请使用旧的Valgrind工具。