我需要在 OS X 上检索内存最密集的应用程序* 的名称。解决方案应该在 Objective-C 中,同时最好避免使用第 3 方 API。解决方案不能包含任何解析。
*应用程序的内存强度可以定义为该应用程序使用的实际内存量。
我需要在 OS X 上检索内存最密集的应用程序* 的名称。解决方案应该在 Objective-C 中,同时最好避免使用第 3 方 API。解决方案不能包含任何解析。
*应用程序的内存强度可以定义为该应用程序使用的实际内存量。
您可以使用它sysctl
来检索可用的进程。SO 问题“我们可以检索当前在 iPhone 和 iPad 上运行的应用程序吗? ”有一个应该适用于 macOS 的答案……我试过了,只需将代码放入 Xcode 4.4 新 macOS 项目的答案中,#importing 并执行NSLog 在结果数组上而不是返回它,它整齐地显示收集的进程名称和 ID 数组。
虽然其中有大量信息struct kinfo_proc
及其嵌套struct extern_proc
,但不幸的是,我没有看到一种简单的方法来检索各个进程的内存信息。
为此,您可以咨询libtop.c
Apple 的开源产品。链接版本来自MacOS X 10.8 库。
在任何情况下,如果您将 sysctl 中的可用进程与 libtop.c 中的进程信息检索代码结合起来,您最终应该得到一个完全符合您需要的程序化解决方案。
并且……另一方面……如果您不介意与这将需要的工作相比进行少量解析,请尝试 SO 答案您可以使用 NSTask,仅替换ps aux -m
该问题执行“grep”的位置。您只想从流中获取第一行真正的输出,并且您必须解析空格以获取包含 RSS 信息的列,但这可能比通过 libtop.c 获得所需内容更容易,取决于你需要什么。
ps aux -m
将根据内存(顶部的最高内存)为您打印出进程。如果您通过管道传输此命令然后过滤顶行来访问它。
一旦你把它输入管道,你所要做的就是提取你想要的位(NSMutableString)。
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 代码未经测试。