如何检索使用中最占用内存的应用程序的名称



我需要检索OS X上最占用内存的应用程序*的名称。解决方案应该在Objective-C中,同时最好不要使用第三方API。解决方案不能包含任何解析。

*应用程序的内存强度可以定义为该应用程序正在使用的实际内存量。

您可以使用sysctl来检索可用的进程。SO问题"我们能检索目前在iPhone和iPad上运行的应用程序吗?"有一个应该适用于macOS的答案……我试过了,只需将代码放在Xcode 4.4新macOS项目的答案中,#导入并在结果数组上执行NSLog,而不是返回它,它会整齐地显示收集到的进程名称和ID数组。

虽然struct kinfo_proc及其嵌套的struct extern_proc中有丰富的信息,但不幸的是,我看不到检索单个进程的内存信息的简单方法。

为此,您可以咨询苹果的开源产品libtop.c。链接版本来自MacOS X 10.8库。

在任何情况下,如果您将从sysctl中提取可用进程与libtop.c中的进程信息检索代码结合起来,您最终应该会得到一个完全符合您所需的程序化解决方案。

并且…另一方面……如果你不介意与这项工作相比做一点点解析,请尝试SO答案。你可以使用NSTask,只在该问题执行"grep"时替换ps aux -m。您只想从流中获得第一行真正的输出,并且必须解析空格才能找到包含RSS信息的列,但这可能比通过libtop.c获得所需内容更容易,具体取决于您需要它做什么。

Bash对于这样的事情非常好。使用bash可以获得以下命令:

ps -p `ps aux | awk '{print $4,$2}' | sort -nr | head -n 1 | awk '{print $2}'` | awk '{print $4}' | tail -n 1

(可能会优化,但仍然有效)

然后做一些类似的事情:

NSTask *task;
task = [[NSTask alloc] init];
[task setLaunchPath: @"ps -p `ps aux | awk '{print $4,$2}' | sort -nr | head -n 1 | awk '{print $2}'` | awk '{print $4}' | tail -n 1"];
NSPipe *pipe;
pipe = [NSPipe pipe];
[task setStandardOutput: pipe];
NSFileHandle *file;
file = [pipe fileHandleForReading];
[task launch];
NSData *data;
data = [file readDataToEndOfFile];
NSString *string;
string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
NSLog (@"Command Returned:n%@", string);
[string release];
[task release];

bash命令有效,但目标c代码未经测试。

ps aux -m

将根据内存(顶部的最高内存)打印出进程。如果通过管道传输此命令来访问此命令,则过滤顶部行。

关于NSPipe 的开发人员文档

一旦你有了管道,你所要做的就是排出你想要的比特(NSMutableString)。

最新更新