Mac OS X:什么在使用我的“活动”内存?

Bas*_*Ben 7 memory osx-snow-leopard memory-leaks

我正在使用一台配备 8 GB RAM 的最新 MacBook Pro,在工作中使用它几个小时后,我注意到“活动”内存的数量在不断增长。

每当我重新启动 Mac 时,一切看起来都很好,而且几乎不使用任何 RAM。但几个小时后,它看起来像这样:

截屏

如您所见,在本例中大约为 4.3 GB。

作为开发人员,我知道“活动内存”是正在运行的进程当前使用的内存量。所以我做的第一件事就是退出所有应用程序并杀死所有似乎不属于 Mac OS X 的进程。

在我这样做之后,我的活动内存下降了大约 400 MB,但卡在了你在屏幕截图中看到的内容上。没有更多的进程或应用程序要退出。

现在我想知道到底什么在保持记忆?top和活动监视器不报告任何具有高内存使用率的进程。

有任何想法吗?

谢谢!


更新 1:

感谢 Doug Harris 的回答,我制作了这张截图。它显示了 2.55 GB 系统范围的活动内存使用量,但该ps命令计算的内存使用量仅为 1.55 GB 。

在此处输入图片说明

我不确定 2.55 GB 的其余部分去了哪里或分配到哪里了。我安装了 Instruments,但由于这确实发生在几个小时的跨度内,因此很难使用 Instruments。这感觉就像操作系统中某处的内存泄漏。可能是驱动程序(尽管我没有安装任何内核扩展 - 使用 进行检查kextstat)。

我个人认为能够看到有关内存管理状态的“更多”信息会很有趣。在 Linux 下,“/proc”下有一些信息可用,afaik。

Dou*_*ris 4

尽管没有一个进程的内存使用率很高,但仍然有很多进程在运行——所有这些加起来。

使用ps和其他命令行工具,您可以更深入地研究这一点。

首先,使用选项来ps限制仅显示常驻内存和命令名称。-m按内存使用情况对输出进行排序,-a显示所有用户的进程,-x显示与终端无关的进程(即大多数 Mac 应用程序)。

$ ps -axm -o "rss,comm" 
Run Code Online (Sandbox Code Playgroud)

这是我看到的前几行:

   RSS COMM
210256 /Applications/Firefox.app/Contents/MacOS/firefox-bin
158276 /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
155360 /Applications/iTunes.app/Contents/MacOS/iTunes
Run Code Online (Sandbox Code Playgroud)

对于这些位于顶部(并且显示的 Chrome 进程只是其中之一),我并不感到惊讶。RSS 列表示为 1024 字节块。因此 iTunes 使用了大约 151.7 MB。

该输出的格式足够好,如果您喜欢以这种方式分析事物,您可以将其放入电子表格中进行分析。我会坚持使用命令行一段时间

再串起来看看所有进程的总和:

$ ps -axm -o "rss,comm" | awk 'BEGIN { s=0;}; {s=s+$1;}; END { printf("%.2f GB\n", (s/1024.0/1024));}'
Run Code Online (Sandbox Code Playgroud)

我看到的输出2.44 GB并不完全是我在活动监视器中看到的活动内存,但足够接近,我可以使用 ps 来了解这一点。

您可以将那些使用超过 100MB 的进程加在一起:

$ ps -axm -o "rss,comm" | awk 'BEGIN { c=0;s=0;}; ($1 > 100000) {c=c+1;s=s+$1;}; END { printf("%.2f GB from %d processes\n", (s/1024.0/1024),c);}'

0.98 GB from 8 processes
Run Code Online (Sandbox Code Playgroud)

我没有告诉您具体是什么在使用您的 Mac 内存,但这些工具将帮助您发现。