我需要檢索OS X上內存密集程度最高的應用程序*的名稱。 解決方案應該在Objective-C中,同時最好避免使用第三方API。解決方案不能包含任何解析。如何檢索使用率最高的內存密集型應用程序的名稱?
*應用程序的內存強度可以定義爲該應用程序使用的實際內存量。
我需要檢索OS X上內存密集程度最高的應用程序*的名稱。 解決方案應該在Objective-C中,同時最好避免使用第三方API。解決方案不能包含任何解析。如何檢索使用率最高的內存密集型應用程序的名稱?
*應用程序的內存強度可以定義爲該應用程序使用的實際內存量。
您可以使用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,只替換ps aux -m
,其中該問題執行「grep」。您只需要從流中獲取第一個真正的輸出行,並且必須解析空白字符才能到達包含RSS信息的列,但是這可能比通過libtop.c獲得想要的更容易,取決於你所需要的。
您能否將我引用到libtop.c中的特定函數?我瀏覽了鏈接,但沒有發現任何相關的內容。 – fdh 2012-08-22 02:42:30
你需要模仿的內容是在文件靜態函數'libtop_p_task_update()'中調用,這個函數在文件靜態函數'libtop_p_proc_table_read()'中的每個過程調用,這是從公共函數'libtop_sample()'調用的。你可以從'libtop_p_task_update()'中取出特定於你的需求的代碼,而不是把所有其他的統計信息都拿出來,或者你可以調用'libtop_sample()',然後找出如何分類並得到你想要的調用'libtop_tsamp()'的結果。 – 2012-08-22 03:08:51
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代碼雖然未經測試。
上面的代碼給了我一個「啓動路徑不可訪問」的錯誤。任何想法有什麼不對? – fdh 2012-08-21 16:16:58
看看上面的斯圖爾特的鏈接。這可以做到。我目前沒有我的Mac,所以我無法測試任何東西。 – 2012-08-21 20:40:34
ps aux -m
將根據內存(最高內存)向您提供一個進程的打印輸出。如果你通過輸入這個命令來訪問它,然後過濾最上面一行。
一旦你擁有了它在所有你需要做的是管道exstract你想要的比特(的NSMutableString)。
運行上述命令給我一個「啓動路徑不可訪問的錯誤」。我的代碼與下面的代碼相同,除了它使用「ps aux -m」而不是ps -p'ps aux | awk'{print $ 4,$ 2}'| sort -nr |頭-n 1 | awk'{print $ 2}''| awk'{print $ 4}'| tail -n 1 任何想法有什麼不對? – fdh 2012-08-21 16:16:12
我想你需要告訴它如何找到shell解釋器,如下所示:[nstask-launch-path-not-accessible](http://stackoverflow.com/questions/3221432/nstask-launch-path-not-無障礙) – 2012-08-21 18:09:57
@JesseRusak沒事。我對OSX的經驗很少,不幸的是Google搜索沒有提供任何相關結果。 – fdh 2012-08-05 17:04:10
你能否詳細說明你的意思是「最密集的內存」? – 2012-08-05 17:47:25
@JoshCaswell我已經添加了一些細節,應該澄清它。 – fdh 2012-08-05 17:52:32