给定的 Mac 应用程序使用多少交换?

Cha*_*art 20 mac swap virtual-memory macos

有什么方法可以判断在 Mac OSX (10.2+) 上运行的特定应用程序是否已换出部分内存(即,换出其中一个/private/var/vm/swapfile*文件)?多少钱?

赏金 (150 rps)

简单的问题。如果我在赏金期到期后不到 2 天看到它,第一个正确答案将被接受。如果我还没有得到一个,我会把它奖励给告诉我最有趣的新事实的人。如果我没有从任何答案中学到任何东西,我会将赏金奖励给写得最漂亮的人。

tro*_*000 17

我一直在谷歌搜索 ;-) 据我所知,给定进程的虚拟内存分为由操作系统处理并呈现给应用程序的页面,就好像它是 RAM 一样。

在 OS X 中,基于 Mach 内核,这是由一个名为dynamic_pager. /private/var/vm正如您所提到的,此过程会生成交换文件。这些交换文件不是基于每个应用程序生成的,而是基于“需要内存”的。交换文件被分成 4096 字节的页面,然后这些页面被分配给(被操作系统认为)需要虚拟内存的进程。因此,您不能将交换文件与给定的应用程序相关联,但您可以查看给定进程使用了​​多少页。

您可能想vm_stat在 Termial 中尝试该命令。这为您提供了 VM 使用情况的统计信息(请注意,“页面大小”乘以活动页面数等于交换文件的大小)。这也解释了为什么您可以使用 VM 拥有多个进程,但只有几个交换文件。

其他有趣的命令是vmmap [process id]pagestuff


aya*_*yaz 6

vmmap PID命令应该为您提供有关给定进程的一些有用的数字统计信息。


And*_*eas 5

基于这里发布的想法,我创建了这一小行代码:

sudo vmmap notifyd | grep -A3 'Summary'
Run Code Online (Sandbox Code Playgroud)

它显示了 vmmap 输出的摘要部分(3 行)。我notifyd在这个例子中使用过,但你可以用你知道的任何 PID 替换它。

此行将尝试列出所有正在运行的进程的所有摘要行。显然有些会失败,因为他们的进程 id 已经消失(进程结束),但总的来说,我发现这是滚动内存信息列表并找到顶部交换器的好方法。

ps -o pid= -xa | awk '{print $1}' | xargs -n 1 sudo vmmap | grep -A3 'Summary'
Run Code Online (Sandbox Code Playgroud)

编辑:一些匿名用户看到最后一个命令行需要改进,因为显然原始变体不再起作用。所以非常感谢你,无论你是谁,我很抱歉你的编辑被拒绝了。(第一个命令之前读取了 'ps xa' 并导致 vmmap 失败,因为 ps 的标题被抛出)

进一步改进:如果您想立即知道程序的名称,请使用此小更改

ps -o pid= -xa | awk '{print $1}' | xargs -n 1 sudo vmmap | egrep 'swapped_out|Path'
Run Code Online (Sandbox Code Playgroud)

对该命令另一端的一些修改使您能够过滤某些程序名称或命令行路径组件。在这里,我们仅以“Library/PrivateFrameworks”为例查看所有进程。

ps -o pid,command= -xa | grep 'Library/PrivateFrameworks' | awk '{print $1}' | xargs -n 1 sudo vmmap |
Run Code Online (Sandbox Code Playgroud)