2011-11-29 88 views
6

我有一個奇怪的內存問題我有問題的解決,並希望得到一些建議,以尋找其他地方。iPhone內存警告和崩潰 - 但儀器顯示內存使用率低

我有的程序(iPhone應用程序)有一個功能,它基本上下載大量的文件,處理那些是JSON,並將其餘的存儲到磁盤。 JSON處理是CPU密集型的,每個文件可能需要幾秒鐘的時間,所以我有一個NSOperationQueue,maxConcurrency限制爲1,處理所有繁重的操作,並有一個隊列管理多個文件下載。

自從iOS5問世以來,該應用程序在完成下載順序時沒有崩潰,並且到目前爲止我所嘗試的是有問題;

1)將performSelectorOnBackgroundThread JSON處理更改爲使用單個NSOperationQueue,以限制處理大對象的後臺線程的數量。

2)添加NSAutoReleasePools循環內創建多個,大,瞬態的對象。

3)刷新sharedURLCache以確保文件沒有掛在系統緩存中。

4)使用NSKeyedArchiver將JSON對象存儲到磁盤,並在線程之間傳遞文件名而不是實際對象,以再次嘗試減少當前正在使用的保留對象的數量和大小。所有這些起初似乎都有所作爲,而當我查看內存分配情況時,現在我已經將峯值使用率從略高於20MB(因此難怪它正在崩潰)降低到10MB以下,並且但應用程序仍像以前一樣崩潰,內存不足。

我試圖跟蹤什麼是吃內存導致應用程序崩潰,在這個場合我有真正的問題說服儀器告訴我任何有用的東西。

下面是一個典型的跟蹤(在iPhone 3GS運行iOS 4.3.5)

enter image description here

可不久後看到,峯值使用超過7MB一點點,但,你可以看到2與低內存有關的標誌,然後是緊急內存低,隨後應用程序不久之後終止。

如果我使用內存監視器,崩潰的原因似乎足夠清晰 - 物理內存正在耗盡 - 請看下面的淺綠色曲線。低內存警告與物理內存耗盡共存(不出意外)。

enter image description here

有顯示FWIW要麼沒有泄漏(我已經做了,在其他運行)。

它不是圖像緩存或NSURLConnection緩存,我唯一能想到的是可能有一些不良的泄漏未被檢測到......但是我遇到了識別它們的問題,因爲如果我點擊進入所有分配來查看活動的對象,然後執行命令-A將它們全部選中(爲了將它們粘貼到電子表格中以查看內存似乎在哪裏),在我點擊命令-C來複制它們的位置,儀器beachballs和從未恢復。

我真的不知道發生了什麼事。有沒有人對如何說服樂器向我展示一些關於使用這種內存的更有用的信息有一些建議?

對不起,我不能發佈任何有意義的代碼片段......希望儀器截圖至少讓你知道我來自哪裏。

+0

你說你的麻煩始於iOS 5,但你的蹤跡是在4.3? (它有問題!) –

+0

是的,這個問題最早是在iOS5中發現的,起初它似乎僅限於iOS5設備,但是目前在測試期間它似乎在其他系統上也失敗了。我認爲我們現在正在更密切地關注它,所以iOS版本可能會或可能不相關。 – Roger

回答

6

泄漏工具對於找出除了應用中明顯的泄漏之外的任何東西都不是非常有用。

您所描述的是堆積分析的理想候選人。

tl; dr Heapshot analysis允許您在任何兩個時間點(您確定點的位置)之間準確查看您的應用程序堆的增長情況。

+0

謝謝,我在一週前發現了你的heapshot博客,發現它最有用(+1)。我做了一些分析,沒有看到任何不合適的事情,但我會在早上再次看到它,並再次查看,因爲可能我錯過了它可能告訴我的事情。 – Roger