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

时间:2016-07-23 23:52:06

标签: c++ memory lldb resource-management

我正在Mac OS上编写一个简单的C ++程序。我刚刚

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

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

我没有退出主要的范围。当我再次检查顶部时,我正坐在关闭大括号的大括号。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

如果您想更精确地跟踪内存消耗,则需要一些分析工具,例如valgrindheap command