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

时间:2012-08-05 16:51:35

标签: macos process-management

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

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

3 个答案:

答案 0 :(得分:3)

您可以使用sysctl来检索可用的进程。 SO问题“Can we retrieve the applications currently running in iPhone and iPad?”有一个应该适用于macOS的答案...我尝试过,只需将代码放在Xcode 4.4新macOS项目的答案中,#importing并在结果数组上执行NSLog而不是返回它,它整齐地显示收集的进程名称和ID数组。

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

为此,您可以参考libtop.c,这是Apple的开源产品。链接版本来自MacOS X 10.8 library

在任何情况下,如果你将sysctl中的可用进程与libtop.c中的进程信息检索代码结合起来,你最终应该得到一个程序化的解决方案,以确切地找到你想要的东西。

和...另一方面......如果你不介意做一小部分解析而不是这需要的工作,试试SO回答You can use NSTask,只能用ps aux -m代替那里问题执行“grep”。你只想从流中得到第一个真正的输出行,你必须解析空格才能到达包含RSS信息的列,但这可能比通过libtop.c得到你想要的更容易,取决于你需要它。

答案 1 :(得分: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代码未经测试。

答案 2 :(得分:0)

ps aux -m

将根据内存(顶部最高内存)打印出处理过程。如果通过移植此命令来访问此命令,然后过滤顶行。

Developer docs on NSPipe

一旦你用管道传输了所有你需要做的就是抽取你想要的位(NSMutableString)。