如何检索使用中内存最密集的应用程序的名称?
Posted
技术标签:
【中文标题】如何检索使用中内存最密集的应用程序的名称?【英文标题】:How can the name of the most memory intensive application in usage be retrieved? 【发布时间】:2012-08-05 16:51:35 【问题描述】:我需要检索 OS X 上最占用内存的应用程序的名称*。 解决方案应该在 Objective-C 中,同时最好避免使用 3rd 方 API。解决方案不能包含任何解析。
*应用程序的内存强度可以定义为该应用程序使用的实际内存量。
【问题讨论】:
@JesseRusak 什么都没有。我对 OSX 的经验很少,不幸的是,谷歌搜索没有提供任何相关结果。 您能否详细说明“最占用内存”的含义? @JoshCaswell 我已经添加了一些应该澄清它的细节。 我不知道答案,但作为代码示例,“top”实用程序应该有可用的源代码,并且它能够执行您的要求。 【参考方案1】:您可以使用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 ,仅在该问题执行“grep”时替换 ps aux -m
”。您只想从流中获取第一行真正的输出,并且您必须解析空格以获取包含 RSS 信息的列,但这可能比通过 libtop.c 获得所需内容更容易,取决于你需要它。
【讨论】:
你能给我介绍一下 libtop.c 中的特定函数吗?我浏览了链接,但找不到任何相关内容。 您想要模仿的内容在文件静态函数libtop_p_task_update()
中,文件静态函数libtop_p_proc_table_read()
中的每个proc 都会调用该函数,该函数从公开可用的函数libtop_sample()
中调用.您可以从libtop_p_task_update()
中提取特定于您的需求的代码,而不是获取所有其余的统计信息,或者您可以调用libtop_sample()
,然后找出如何排序并从结果中得到您想要的对libtop_tsamp()
的调用。【参考方案2】:
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 代码未经测试。
【讨论】:
上面的代码给了我一个“启动路径不可访问”的错误。知道有什么问题吗? 看看上面 Stuart 的链接。那可以做到。我目前没有 Mac,所以我无法测试任何东西。【参考方案3】:ps aux -m
将根据内存(顶部的最高内存)打印出进程。如果您通过管道传输此命令然后过滤顶行来访问它。
Developer docs on NSPipe
一旦你将它通过管道传输,你所要做的就是提取你想要的位(NSMutableString)。
【讨论】:
运行上述命令会给我一个“启动路径不可访问错误”。我的代码与下面的代码相同,除了它使用“ps aux -m”而不是 ps -pps aux | awk 'print $4,$2' | sort -nr | head -n 1 | awk 'print $2'
| awk '打印 $4' | tail -n 1 知道有什么问题吗?
我认为您需要告诉它如何找到 shell 解释器,如下所示:nstask-launch-path-not-accessible以上是关于如何检索使用中内存最密集的应用程序的名称?的主要内容,如果未能解决你的问题,请参考以下文章