我需要在OS X上检索内存最密集的应用程序*的名称。 解决方案应该在Objective-C中,同时最好不要使用第三方API。解决方案不能包含任何解析。
*应用程序的内存强度可以定义为该应用程序使用的实际内存量。
答案 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
将根据内存(顶部最高内存)打印出处理过程。如果通过移植此命令来访问此命令,然后过滤顶行。
一旦你用管道传输了所有你需要做的就是抽取你想要的位(NSMutableString)。