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

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 -p ps aux | awk 'print $4,$2' | sort -nr | head -n 1 | awk 'print $2' | awk '打印 $4' | tail -n 1 知道有什么问题吗? 我认为您需要告诉它如何找到 shell 解释器,如下所示:nstask-launch-path-not-accessible

以上是关于如何检索使用中内存最密集的应用程序的名称?的主要内容,如果未能解决你的问题,请参考以下文章

设计数据密集型应用 第三章:存储与检索

内存性能测试工具

使内存密集型后台应用程序“友好”

如何从 PySpark rdd.mapPartitions 运行内存密集型 shell 脚本

如何基于java应用内存扩展aws ec2集群

哪个 GWT 库最适合开发数据密集型应用程序