【问题标题】:How to determine the real memory usage of a single process?如何确定单个进程的真实内存使用情况?
【发布时间】:2015-06-21 20:20:05
【问题描述】:

如何计算单个进程的实际内存使用量?我不是在谈论虚拟内存,因为它一直在增长。例如,有像 smaps 这样的 proc 文件,您可以在其中获取进程的映射。但这是虚拟内存,该文件的值只是在运行过程中不断增长。但我想反映一个进程的真实内存使用情况。例如。如果你绘制一个进程的内存使用情况,它应该代表内存的分配以及内存的释放。所以情节应该像一个上下运动而不是一个线性函数,它只是在一个运行过程中不断增长。

那么,我如何计算实际的内存使用量?如有任何有用的答案,我将不胜感激。

【问题讨论】:

  • 所以澄清一下,当你说“真实内存”时,你的意思是像当前 malloc'd(而不是释放)的空间的运行计算,对吗?这被称为进程的“实时大小”。

标签: linux memory memory-management


【解决方案1】:

这实际上是一个复杂的问题。在操作系统级别上,程序内存使用量的两个最常见指标是虚拟大小驻留集大小。 (这些在ps -u 的输出中显示为VSZRSS 列。)粗略地说,这些告诉程序分配给它的总内存,以及它当前正在使用的内存量。

更复杂的问题是,当您使用 malloc(或 C++ new 运算符)分配内存时,内存是从您的进程中的一个池中分配的,该池是通过偶尔从操作请求分配内存来构建的系统。但是当你释放内存时,内存会回到这个池中,但它通常不会返回给操作系统。因此,当您的程序分配和释放内存时,您通常不会看到它的内存占用量上下波动。 (但是,如果它释放了大量内存然后不再分配它,最终您可能会看到它的 rss 下降。)

【讨论】:

  • 那么,你有什么推荐的?有没有办法获取必要的信息来计算进程的实际内存使用情况?
  • 好吧,它可能最终成为“这取决于你如何定义‘真实记忆’”的问题之一。在我的书中,如果虚拟内存大小不断增长,则意味着您遇到了内存泄漏。您可能可以暂时摆脱其中的一个,但不是在一个长期运行的过程中。如果你真的只关心你的进程分配了多少物理内存,那么 rss 和/或 maxrss 可能接近你想要的。
  • 另外,右边有一些相关问题看起来很相关!
  • 我说的是物理内存。但是 rss 并不是很可靠。有 uss 和 pss 等值,它们是关于进程内存使用的更可靠的值。但是rss不是很满意。那么,这意味着,没有办法获取进程的物理内存使用情况?
  • 对此我不确定(我再次鼓励您探索右侧的相关链接),但在虚拟内存环境中,询问您的程序正在使用多少物理内存是短暂的和非特别相关的统计数据,这可能是难以确定的原因之一。它不仅可以根据您的进程正在做什么,还可以根据系统上的其他进程正在做什么而改变:如果您分配了“未使用”的内存,则操作系统可能会在以下情况下将物理内存带走其他价格需要它,但如果不需要,则不需要。
猜你喜欢
  • 2015-12-03
  • 2011-04-30
  • 2016-04-17
  • 2010-09-28
  • 2015-10-25
  • 2018-01-12
  • 2010-10-19
  • 2016-05-30
  • 1970-01-01
相关资源
最近更新 更多