Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何检索使用中内存最密集的应用程序的名称?_Macos_Process Management - Fatal编程技术网

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

Macos 如何检索使用中内存最密集的应用程序的名称?,macos,process-management,Macos,Process Management,我需要检索OSX上内存最密集的应用程序*的名称。 解决方案应为Objective-C,同时最好避免使用第三方API。解决方案不能包含任何解析 *应用程序的内存强度可以定义为该应用程序使用的实际内存量 您可以使用来检索可用的进程。这个问题的答案应该适用于macOS…我试过了,只需将代码放在Xcode 4.4新macOS项目的答案中,在结果数组上导入并执行NSLog,而不是返回它,它会整洁地显示收集到的进程名称和ID数组 虽然struct kinfo_proc及其嵌套的struct extern_p

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

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

您可以使用来检索可用的进程。这个问题的答案应该适用于macOS…我试过了,只需将代码放在Xcode 4.4新macOS项目的答案中,在结果数组上导入并执行NSLog,而不是返回它,它会整洁地显示收集到的进程名称和ID数组

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

对此,您可以咨询,这是苹果的开源产品。链接版本来自

在任何情况下,如果您将从sysctl中提取可用进程与libtop.c中的进程信息检索代码结合起来,那么最终应该会得到一个完全符合您需要的编程解决方案


而且…另一方面…如果你不介意做一个非常小的解析,与这项工作相比,这将需要,尝试这样的答案,只替换ps aux-m的问题执行grep。您只需要从流中获取第一行实际输出,并且必须解析空白以获取包含RSS信息的列,但这可能比通过libtop.c获取所需内容更容易,这取决于您需要它做什么。

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代码未经测试

ps aux -m
将给你一个打印出来的进程在内存方面最高的内存在顶部。如果通过管道传输此命令访问此命令,则过滤顶行


一旦你把它装上管道,你所要做的就是把你想要的东西取出。

@JesseRusak什么都不做。我对OSX的经验很少,不幸的是谷歌搜索没有提供任何相关的结果。你能详细解释一下什么是内存最密集型吗?@JoshCaswell我已经添加了一些细节,应该可以澄清这一点。我不知道答案,但作为一个代码示例,top实用程序应该有可用的源代码,并且它能够执行您要求的操作。运行上述命令会给我一个启动路径不可访问错误。我的代码与下面的代码相同,除了它使用ps aux-m而不是ps-p ps aux{print$4,$2}}sort-nr | head-n1 | awk{print$2}| awk{print$4}tail-n1知道怎么回事吗?我想你需要告诉它如何找到shell解释器,如下:上面的代码给了我一个启动路径不可访问的错误。知道怎么回事吗?看看上面斯图尔特的链接。那就行了。我目前没有Mac,所以无法测试任何东西。你能给我介绍libtop.c中的一个特定函数吗?我浏览了链接,但找不到任何相关内容。您想要模仿的是文件静态函数libtop_p_task_update,它是为文件静态函数libtop_p_proc_table_read中的每个进程调用的,它是从公开可用的函数libtop_sample调用的。您可以从libtop_p_task_update中提取特定于您需要的代码,而不获取所有其他统计信息,或者您可以调用libtop_sample,然后找出如何从调用libtop_tsamp的结果中排序和获取所需内容。