C ++。如何从一开始就获得进程分配的最大内存量?

时间:2011-08-04 12:57:11

标签: c++ memory profiling

我想知道进程在其工作期间分配的最大堆数量。

mallinfo()为我提供了当前分配的内存量。所以,我可以在单独的线程中经常询问allinfo()并存储最大值。

但是,也许,有关进程的这些信息会写在系统的某个地方?首先,我对Windows感兴趣。

3 个答案:

答案 0 :(得分:1)

不,系统中没有地方可以跟踪进程自启动以来所使用的最大堆内存量。

答案 1 :(得分:1)

如果仅用于分析,则可以使用分析工具,例如valgrind的massif。我不知道Windows有什么工具,但肯定有。

答案 2 :(得分:0)

对于MS-Windows,您希望使用GetProcessMemoryInfo()功能。这为您提供了各种尺寸的结构。你会想测试一下,看看你们自己有什么用,但我认为它有很好的记录。

您将获得如下所示的结构:

typedef struct _PROCESS_MEMORY_COUNTERS {
  DWORD  cb;
  DWORD  PageFaultCount;
  SIZE_T PeakWorkingSetSize;
  SIZE_T WorkingSetSize;
  SIZE_T QuotaPeakPagedPoolUsage;
  SIZE_T QuotaPagedPoolUsage;
  SIZE_T QuotaPeakNonPagedPoolUsage;
  SIZE_T QuotaNonPagedPoolUsage;
  SIZE_T PagefileUsage;
  SIZE_T PeakPagefileUsage;
} PROCESS_MEMORY_COUNTERS, *PPROCESS_MEMORY_COUNTERS;

对于Linux,此时有一个转义我的界面,但您也可以在流程的状态文件中找到该信息。因此,从进程本身,您执行getpid()并从中读取状态文件:

std::string status_filename("/proc/" + std::to_string(getpid()) + "/status");
std::ifstream status(status_filename, std::ios::in);
... // read file 'status'

Vm开头的行是您感兴趣的行。例如,VmPeak将告诉您进程使用的最大内存量。

更多关于Linux下Runtime Memory Measurement的内容。