Как можно получить имя наиболее интенсивно использующего память приложения?

Мне нужно получить имя приложения с наибольшим объемом памяти* в OS X. Решение должно быть на языке Objective-C, желательно воздерживаясь от использования сторонних API. Решение не может содержать синтаксический анализ.

* Интенсивность памяти приложения может быть определена как объем реальной памяти, используемой этим приложением.


person fdh    schedule 05.08.2012    source источник
comment
@JesseRusak Ничего. У меня минимальный опыт работы с OSX, и, к сожалению, поиск в Google не дал подходящих результатов.   -  person fdh    schedule 05.08.2012
comment
Не могли бы вы уточнить, что вы подразумеваете под наиболее интенсивной памятью?   -  person jscs    schedule 05.08.2012
comment
@JoshCaswell Я добавил несколько деталей, которые должны прояснить это.   -  person fdh    schedule 05.08.2012
comment
Я не знаю ответа, но в качестве примера кода у верхней утилиты должен быть доступный исходный код, и она может делать то, что вы просите.   -  person Phillip Mills    schedule 05.08.2012


Ответы (3)


вы можете использовать sysctl для получения доступных процессов. вопрос SO "Можем ли мы получить приложения, которые в настоящее время работает на iPhone и iPad?" есть ответ, который должен работать для macOS… я попробовал, просто поместив код в ответ в новый проект macOS Xcode 4.4, #импортировав и выполнив NSLog в массиве результатов, а не чем возвращать его, и он аккуратно отображает собранный массив имен процессов и идентификаторов.

и хотя в 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 , смотря для чего он вам нужен.

person john.k.doe    schedule 17.08.2012
comment
Не могли бы вы порекомендовать мне конкретную функцию в libtop.c? Я прошел по ссылке, но ничего подходящего не нашел. - person fdh; 22.08.2012
comment
Суть того, что вы хотите имитировать, находится в статической функции файла libtop_p_task_update(), которая вызывается для каждого процесса в статической функции файла libtop_p_proc_table_read(), которая вызывается из общедоступной функции libtop_sample(). вы можете либо вытащить код, специфичный для ваших нужд, из libtop_p_task_update() и не брать всю остальную статистику, либо вы можете вызвать libtop_sample(), а затем придумать, как отсортировать и получить то, что вы хотите, из результата вызовов libtop_tsamp() . - person john.k.doe; 22.08.2012

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 не тестировался.

person Dale Myers    schedule 21.08.2012
comment
Приведенный выше код дает мне ошибку пути запуска, недоступную. Есть идеи, что случилось? - person fdh; 21.08.2012
comment
Взгляните на ссылку Стюарта выше. Это могло сделать это. В настоящее время у меня нет моего Mac, поэтому я не могу ничего проверить. - person Dale Myers; 22.08.2012