猜猜看,另一個Android位圖 - OOM問題!Android內存管理:屏幕密度,請求的圖像大小和可用堆
背景
雖然壓力測試our application它已經注意到,有可能最高時的應用程序的進程的內存分配與被記錄在隨後的內OutOfMemory
異常持續,大量使用(猴亞軍等)後,堆棧跟蹤。當選擇ViewPager
下的頁面時,該應用下載圖像(一次約3個)。當應用程序的長度和氣息被執行時,可以有280多個圖像可供下載。該應用程序使用Picasso by Square來進行圖像下載抽象。值得注意的是,我們應用程序的代碼中沒有任何一點是我們直接操縱位圖...我們相信,非常有才華的Square Inc.員工比我們做得更好。
這裏是一個圖片
的下面曲線圖顯示了在dalvikvm-heap
日誌消息下記錄時的堆分配。紅點指示用戶帶來了新鮮組文章到應用程序,以加強工作出色和應力的應用的量...
DALVIKVM heap allocations http://snag.gy/FgsiN.jpg 圖1: Nexus之一堆分配;奧姆斯發生在80MB +
調查最新
反對使用Nexus S,的Nexus 4,野火,HTC難以置信和進一步測試設備萬千,軼事測試已經示出的存儲器管理是足夠用DVM GC跟上由應用程序完成的繁重工作。但是,在Galaxy S II,III,IV和HTC One等高端設備中,OOM普遍存在。事實上,如果有足夠的工作要做,我想我們所有的設備最終都會出現故障。
問題
顯然有屏幕密度之間的進程的存儲器分配和圖像的數量在給定的大小會關係(該請求的圖像尺寸基於關閉的ImageView的大小),導致該應用程序超出堆限制。我即將開始量化這種關係,但希望SO社羣關注這個問題,並(a)同意或不同意這種關係是值得的,(b)提供文獻說明如何最好地擬定這種關係。
重要的是要注意,如果我們破壞圖像質量,我們的OOM全部消失,但是可惜的是UX更差,這就是爲什麼我們希望通過最有效地利用可用堆來切塊。
備註:以下是負責將這些圖像加載到已佈置視圖的代碼部分;
picassoInstance.load(entry.getKey())
.resize(imageView.getMeasuredWidth(),
imageView.getMeasuredHeight())
.centerCrop()
.into(imageView);
上面提到的「圖像質量的橫飛」簡單地由若干像「4」除以imageView.getMeasured...
。
畢加索還提供了多少內存用於位圖的快照。您嘗試加載的圖片有多大?他們是全屏嗎?即使是擁有大量內存的最佳手機,也會通過加載三張或更多圖像而崩潰。你認爲你的觀點是在調用畢加索之前測量的嗎?您也可以嘗試使用'fit()'來代替。 – dnkoutso
如果您的應用程序在位圖上非常密集,您也可以考慮探索'largeHeap'屬性。如果啓用,畢加索將相應地調整內存。對我來說,黃金法則就是儘可能多地解碼,而不是更多。看起來你正在這樣做。我會密切關注你的使用情況。在我已經在多種設備上測試過的畢加索樣本應用程序中,我從未得到過OOM異常,看起來高端設備在清理垃圾方面處理得非常好。 – dnkoutso
感謝您的建議@dnkoutso。據我所知,畢加索表現良好;當OOM確實發生時總能恢復。我會讓你張貼我的漏洞。不感興趣;我是否應該明確地關閉畢加索? – OceanLife