我得到'java.lang.OutOfMemoryError:位圖大小超過VM預算'錯誤...我在做什麼是,我從服務器下載〜50圖像並將它們存儲在內存中。再次 - java.lang.OutOfMemoryError:位圖大小超過VM預算
當我第一次看到這個問題,我優化我們的圖像只下載縮略圖(50 JPEGS,〜12kB,大小160x240px),我開始通過調用Bitmap.recycle(),只要我不需要它們就釋放它們。一切正在更新的手機,其中過程可以得到32MB,但在最大16MB的舊手機不能。
所以我的問題是:
它是正確的,所有的進程都僅限於在舊手機32MB或更小(即內存調用Runtime.getRuntime()maxMemory()調用返回)這個內存是用於Dalvik,框架,應用程序和數據的嗎?
我們可以在應用程序中使用更多內存,然後返回數量Runtime.getRuntime()。maxMemory()?
我應該如何優化圖像 - 它們現在非常小...我應該開始將它們交換到內部閃存/ SD?只要他們在GridView控件顯示我保持他們的記憶...
我感謝所有幫助 - 我經歷了類似的線程就在這裏和做了什麼我已經看到有...但它仍然是不夠的......
編輯更新
我加了這些意見後weakwire
答案。
•在我的情況下,我下載了50張圖像,並將它們全部存儲在內存中的位圖對象中。見下面爲什麼我這樣做。
•內存佔用多少內存位圖對象?它是否以原始格式存在意味着如果圖像是160x240x24bpp
它在內存中佔用~115 kB
,那麼50 images are ~6MB
? 這是正確的嗎?
•我也讀到圖像是不是我的進程堆的一部分,但他們都算,所以使用maxMemory(),totalMemory(),freeMemory()不能真正幫助。 這是正確的嗎?
•我的應用程序UI具有完整的自定義圖形(60個PNG文件,在draw9pacth格式很多人)
•我有24/32 MB的設備沒問題,我的問題只有16個MB的設備
•只要我下載所有50張圖像並將它們存儲到內存中,我就會在2列寬度中顯示它們GridView。我想爲此我需要保留堆上的所有圖像(保存到內部閃存,我認爲這不是解決方案)。 這是正確的假設嗎?
•當我初始化應用程序並加載用戶界面時,我可以看到我有448kB的可用內存分配了整個16384kB預算的5459kB。我假設我不能真正使用整個16384kB +,如果我理解正確的話我從maxMemory(),totalMemory(),freeMemory()看不到有多少已經加載的圖像佔用,因爲dalvik-vm沒有'看見'這堆。假設〜2M已經被使用,我可以使用高達〜14MB,我有5.5MB左右,所以我可以很容易地與內存中的50個圖像碰到OOM問題... 這是正確的計算?
我肯定會看看建議的視頻 - 它看起來不錯 - 但weakwire
,請儘量回答我的問題......感謝您的支持和您的時間!
http://stackoverflow.com/questions/2131947/android-memory-allocation – confucius