c++ - 在 Linux 中使用 proc/pid/status 为进程分配数据时看到堆大小增加

标签 c++ embedded-linux heap-memory profiler metrics

我创建了一个简单的程序,每次用户单击“输入”时,它都会将一个整数数组分配到堆/空闲存储区。我的最终目标是查看每次新分配时堆内存大小的变化。为此,我检查状态文件以查看堆内存大小的变化。不幸的是,在每次分配时,状态文件都不会更新。似乎我可以让文件更新的唯一方法是如果我用一堆回车垃圾邮件程序然后它更新。为什么要这样做?当我在嵌入式系统上工作时,我需要一种可靠的方法来确定我的程序从动态分配中占用的内存范围。谁能提供对/proc//status 的任何见解或可以确定堆内存大小的另一种方法?

此外,status 还提供了以 KB 为单位的内存,如果能以更细粒度的字节查看此信息,那就太好了 - 有没有办法做到这一点?谢谢。

这是我所做的示例程序:

#include <cstddef>
#include <iostream>

int keepLooping()
{
   return 1;
}   

int main (int argc, char* argv[])
{
   int exit_code = 0;
   int fd = -1;

   do
   {
      do 
      {
         std::cout << '\n' << "Press a key to allocate data to the heap...";
      } while (std::cin.get() != '\n');

      int *someArray = new int[1000];

   }
   while (keepLooping());

   return exit_code; 
}

最佳答案

C++ 实现通常不会直接从操作系统分配每个动态分配,而是请求整页内存(在 Linux 上默认为 4kB)或更多,并在进程内分配较小的分配。因此,操作系统不太可能观察到进程内存使用的较小变化。

在某些系统上,尤其是 Linux,在给定特定配置的情况下,分配动态存储并不一定会占用任何系统资源。此类过度提交内存的系统在实际访问分配的内存之前看不到物理内存使用的任何变化。

valgrind 等内存分析工具可用于包装进程并准确测量整个进程执行过程中堆内存的使用情况。

关于c++ - 在 Linux 中使用 proc/pid/status 为进程分配数据时看到堆大小增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52727610/

相关文章:

Java 堆大小 - 这可行吗?

c++ - 谁负责C++中的栈和堆?

C++ 运算符前置和后置递增

Linux内核崩溃调用堆栈长度

Docker Buildx 无法从本地拉取继承的镜像

linux - 在内存中加载 u-Boot 而不是闪存

java - 高 PermGen,但堆使用率低

c++ - 线程、信号和子处理 : What a world. ..多么美好的世界

c++ - 重载宏

c++ - 在qt中单击按钮重写文件内容