在 Ubuntu/Linux 中查找确切的物理内存使用情况

Find exact physical memory usage in Ubuntu/Linux

(我是 Linux 的新手)

假设我在 Ubuntu 机器上有 1300 MB 内存。 OS 和其他默认程序占用 300 MB 内存,1000 MB 可供我自己的应用程序免费使用。

我安装了我的应用程序,我可以将其配置为在应用程序启动时使用 700 MB 内存。

但是我无法验证它的实际内存使用情况。即使我禁用了交换 space.

VIRT”值显示巨大值和“RES”,“ SHR", "%MEM" 显示非常更少的值

很难找到实际的物理内存使用情况,类似于 Windows 中的“资源监视器”,它会说我的应用程序正在使用 700 MB 内存。

有什么方法可以找到 Ubuntu/Linux 中的实际物理内存吗?

TL;DR - 虚拟内存很复杂。

Linux 进程 当前 物理内存使用率的最佳度量是 RES

RES 值表示当前驻留在物理内存中的所有进程页面的总和。它包括常驻代码页和常驻数据页。它还包括当前驻留在 RAM 中的共享页面 (SHR),尽管这些页面不能完全归因于 >>this<< 进程。

VIRT 值实际上是该进程所有名义分配页面的总和,它包括当前驻留在 RAM 中的页面、当前交换到磁盘的页面。

另见 的解释。


请注意,RES 为您提供(大致)瞬时 RAM 使用率。那就是你问的...

随着时间的推移,“实际”内存使用情况更加复杂,因为 OS 的虚拟内存子系统通常会根据需要换入换出页面。因此,例如,您的应用程序的某些页面最近可能未被访问,然后 OS 可能会将它们换出(交换 space)以释放 RAM 用于您的应用程序所需的其他页面。 .. 或其他东西。

VIRT 值实际上表示虚拟地址 space,是总(虚拟)内存使用量的一个很好的近似值。但是,这可能是一个高估:

  • 进程地址 space 中的某些页面在多个进程之间共享。这包括只读代码段、vforkexec 之间父子进程共享的页面,以及使用 mmap.

    创建的共享内存段
  • 某些页面可能被设置为具有非法访问权限(例如,对于堆栈红色区域)并且可能不受 RAM 或交换设备页面的支持。

  • 某些状态下地址 space 的某些页面可能尚未提交到 RAM 或磁盘...取决于虚拟内存系统的实现方式。 (考虑一个进程请求一个巨大的内存段并且既不读取也不写入的情况。虚拟内存实现可能不会分配 RAM 页面,直到第一次读取或写入页面。如果你使用 lazy swap reservation,交换页也不会被提交。但要注意,惰性交换保留可能会遇到麻烦。)

VIRT 也可能被低估,因为 OS 通常为所有页面保留交换 space ...无论它们当前是换入还是换出。因此,如果您将给定页面的 RAM 和交换版本计算为单独的存储单元,VIRT 通常会低估使用的总存储量。


最后,如果您的真正目标是限制您的应用程序最多使用 700 MB(虚拟地址 space),然后您可以使用 ulimit -v ... 来执行此操作。如果应用程序尝试请求超出其限制的内存,请求将失败。