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

Posted

技术标签:

【中文标题】C++。如何获得进程从一开始就分配的最大内存量?【英文标题】:C++. How to get maximum amount of memory allocated by a process from it's start? 【发布时间】:2011-08-04 12:57:11 【问题描述】:

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

mallinfo() 给了我当前分配的内存量。因此,我可以在单独的线程中频繁询问allinfo() 并存储最大值。

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

【问题讨论】:

如果有办法,它特定于您的特定 malloc 实现。你用的是什么编译器? 【参考方案1】:

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

【讨论】:

【参考方案2】:

如果只是为了分析,你可以使用分析工具,比如 valgrind 的 massif。我不知道有哪些适用于 windows 的工具,但肯定有。

【讨论】:

【参考方案3】:

对于 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的阅读。

【讨论】:

以上是关于C++。如何获得进程从一开始就分配的最大内存量?的主要内容,如果未能解决你的问题,请参考以下文章

优化动态分配内存的变量

如何在进程启动时降低 IOKit 保留的内存量?

操作系统内存分配问题-最佳适应算法(C++源码)

反射式DLL注入--方法

tomcat并发优化配置

linux内存池能分配连续物理内存吗