我有一個應用程序,它獲取線程中的位圖,然後將位圖放入全局內存緩存中。在一個2.2模擬器,我得到一個可再現了內存不足的錯誤裝載足夠的位圖後,(他們是在一個列表視圖):找出位圖分配在哪裏?
FATAL EXCEPTION: pool-1-thread-1
java.lang.OutOfMemoryError: bitmap size exceeds VM budget
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
...
堆看起來穩定(3.3MB),如果我能我不知道看不到內存的增長,因爲我認爲在2.2 os中,位圖內存是分開存儲的?我一直在做hprof轉儲並在MAT中查看它們,並且我的對象計數看起來和預期的一樣。
在ICS手機上運行該應用程序不會出現同樣的問題(但也許只是有更多的內存等)。我認爲在後來的操作系統中,他們將位圖內存作爲堆的一部分?
在這兩種情況下,有沒有辦法查看哪些位圖實例已被我的應用程序分配? hprof轉儲只顯示我認爲系統範圍內的總計數。但我看不到他們從哪裏分配。
我使用:
android.support.v4.util.LruCache<String, Bitmap>
的內存緩存 - 它似乎像位圖數據沒有被清理入口得到驅逐後(我設置緩存有一個5MB的上限)。我記得像recycle()這樣的Bitmap方法,也許它們沒有正確清理?
感謝
我同意一切,除了手動調用System.gc()這被認爲是不好的做法..每個gc(由系統或代碼調用)都會在響應時間(〜15-20ms)內發生小的延遲,這對UI響應總是不利的。 – Ewoks 2012-04-24 14:55:57
我同意。我相應地編輯了我的答案。 – Renard 2012-04-24 16:13:09
全力投票當之無愧:)希望你享受Android的仙境.. :)乾杯 – Ewoks 2012-04-24 20:54:00