top可能显示内存使用不正确

top may be showing incorrect memory usage

本文关键字:不正确 内存 显示 top      更新时间:2023-10-16

我正在Mac操作系统上编写一个简单的C++程序。我只有

int main()
{
    int *n = new int[50000000];
}

我在lldb中启动这个程序,并在分配n的行中放置一个断点。然后我在另一个选项卡中启动top,我看到内存使用量是336K预分配。当我在lldb中执行n时,为了进行n的分配,我预计我的内存使用率会上升。然而,顶部显示了我的程序使用的相同内存量。这可能是什么原因?我试图理解C++中内存分配是如何发生的,这就是我这样做的原因。

我还没有退出main的范围。当我再次检查顶部时,我坐在主花括号的末尾。

top命令显示操作系统查看的进程统计信息。它显示了有多少内存被分配给进程,但没有显示有多少内存在有效使用。它不适用于监视内存分配。

堆和空闲存储的内存分配在C++中取决于实现。但是tt通常不会通过操作系统分配调用进行一一映射。出于性能原因(对操作系统的调用比用户代码内部的调用慢),从操作系统接收的内存分为较大的块:

  • 当c++运行时启动时,它通常会从操作系统中分配一些内存,以便为标准库对象分配所需的内存,并初始化空闲存储以快速满足分配请求
  • 只有当这个初始内存耗尽时,标准库才会从操作系统中分配更多内存
  • 并且在较大的块中再次进行分配,因此不是每个new都会引发一个OS调用

根据您的观察,我猜这个初始分配大于50MB。尝试使用更大的值来查看差异。

如果您想更精确地跟踪内存消耗,您需要一些评测工具,例如valgrindheap命令