2012-08-05 28 views
-1

我需要檢索OS X上內存密集程度最高的應用程序*的名稱。 解決方案應該在Objective-C中,同時最好避免使用第三方API。解決方案不能包含任何解析如何檢索使用率最高的內存密集型應用程序的名稱?

*應用程序的內存強度可以定義爲該應用程序使用的實際內存量。

+1

@JesseRusak沒事。我對OSX的經驗很少,不幸的是Google搜索沒有提供任何相關結果。 – fdh 2012-08-05 17:04:10

+0

你能否詳細說明你的意思是「最密集的內存」? – 2012-08-05 17:47:25

+0

@JoshCaswell我已經添加了一些細節,應該澄清它。 – fdh 2012-08-05 17:52:32

回答

3

您可以使用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獲得想要的更容易,取決於你所需要的。

+0

您能否將我引用到libtop.c中的特定函數?我瀏覽了鏈接,但沒有發現任何相關的內容。 – fdh 2012-08-22 02:42:30

+0

你需要模仿的內容是在文件靜態函數'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

0

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代碼雖然未經測試。

+0

上面的代碼給了我一個「啓動路徑不可訪問」的錯誤。任何想法有什麼不對? – fdh 2012-08-21 16:16:58

+0

看看上面的斯圖爾特的鏈接。這可以做到。我目前沒有我的Mac,所以我無法測試任何東西。 – 2012-08-21 20:40:34

0
ps aux -m 

將根據內存(最高內存)向您提供一個進程的打印輸出。如果你通過輸入這個命令來訪問它,然後過濾最上面一行。

Developer docs on NSPipe

一旦你擁有了它在所有你需要做的是管道exstract你想要的比特(的NSMutableString)。

+0

運行上述命令給我一個「啓動路徑不可訪問的錯誤」。我的代碼與下面的代碼相同,除了它使用「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

+0

我想你需要告訴它如何找到shell解釋器,如下所示:[nstask-launch-path-not-accessible](http://stackoverflow.com/questions/3221432/nstask-launch-path-not-無障礙) – 2012-08-21 18:09:57

相關問題