-1

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

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

4

3 回答 3

3

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

虽然其中有大量信息struct kinfo_proc及其嵌套struct extern_proc,但不幸的是,我没有看到一种简单的方法来检索各个进程的内存信息。

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

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

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

于 2012-08-17T07:51:45.423 回答
0
ps aux -m

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

NSPipe 上的开发人员文档

一旦你把它输入管道,你所要做的就是提取你想要的位(NSMutableString)。

于 2012-08-21T12:23:03.837 回答
0

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 代码未经测试。

于 2012-08-21T08:03:44.117 回答