【问题标题】:Linux: Why do the values in smaps increase continuously?Linux:为什么 smaps 中的值不断增加?
【发布时间】:2015-06-15 20:34:10
【问题描述】:

我总结了当前进程的映射值。在一段时间内重复此操作。将结果保存在文件中,然后我将其绘制出来。我觉得有点奇怪的是,smaps 不同字段的值似乎或多或少呈线性增加。我还使用 c++ 中的新命令分配了一些内存。我释放了内存,但没有明显的区别。我正在接受田野里的一些上下运动。不幸的是,没有任何上下运动。

这种行为是正常的还是我做错了什么?但我很确定,我的解析器可以工作,因为我用 pmap 进行了检查。我的解析器和 pmap 为同一进程返回相同的结果。

【问题讨论】:

  • 从操作系统获取内存需要付出努力。该过程不会将其退回并再次要求它,而是将其保留在身边。对于碎片,无论如何只能有时返回它。要查找泄漏,请使用查找泄漏的实用程序,而不是 smap。
  • 但我的目标是计算 USS 和 PSS。所以我认为 smap 是这两个值的正确来源。你同意?但是如何处理它只是增加的事实呢?

标签: c++ linux memory-management


【解决方案1】:

从操作系统分配内存非常昂贵,因此一次分配大块堆。 new 试图在预分配的堆上找到空的地方,只有在没有空的时候,它才会从操作系统分配另一个块。从这个预先分配的堆中解除分配也只对大块进行。 (您可以查看manual page “mallopt” 了解如何使用环境调整行为。请注意,所有分配都需要在页面中完成,每个通常为 4 KiB 大。)

这适用于小内存分配。大型分配(默认为 128 KiB 或更多,同样可使用 mallopt 进行调整)由匿名 mmap 完成,并在释放时释放。

【讨论】:

  • 好的,我明白了。这意味着进程的虚拟地址空间一直在增长?那么,当过程完成时,它会恢复记忆吗?但是,必须以某种方式计算单个进程的内存使用量。例如,这意味着正在运行的进程的 htop 中的内存使用列必须保持增长。但实际上并没有。你能给我一些关于计算单个进程的内存使用量的提示吗?我感兴趣的值是 USS 和 PSS。我使用 smaps 的原因是,你可以从 smaps 中获取这两个值。
  • @tumbler 正如我在帖子中所写的,当进程中有大量未使用的内存时,就会完成释放。关于内存使用情况,这取决于您的意思。该进程为自己保留了所有分配的内存,没有其他进程可以使用它,因此它从系统中使用了多少内存。这就是你在 USS 看到的。但这并不意味着单个 new 或 delete 会改变这一点,因为在内部,该进程有一些预先分配的内存,但目前尚未使用。您无法从系统级别的统计信息中看到这一点,但进程内部的mallinfo 可以告诉您。
  • smaps 是否提供有关真实内存或虚拟内存的信息?对于内存使用,我的意思是单个进程消耗了多少内存。我想反映真实的内存消耗。这意味着如果内存被释放,应该考虑它。我的程序应该询问每个特定的毫秒并更新使用情况。就像 htop 或类似的东西。还有例如smem 是一个使用 smaps 和其他一些 proc 文件的脚本。我想做类似的事情。
  • 我读到 rss 和 vss 并不能很好地说明单个进程的内存使用情况,但我读到 uss 和 pss 更有希望。
  • smaps 提供有关虚拟(系统)内存的信息。这与 htop 使用的信息相同。但是虚拟内存分配不会随着每个new 或delete 而改变。
猜你喜欢
  • 2023-02-10
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
相关资源
最近更新 更多