2013-10-30 33 views
6

猜猜看,另一個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...

+0

畢加索還提供了多少內存用於位圖的快照。您嘗試加載的圖片有多大?他們是全屏嗎?即使是擁有大量內存的最佳手機,也會通過加載三張或更多圖像而崩潰。你認爲你的觀點是在調用畢加索之前測量的嗎?您也可以嘗試使用'fit()'來代替。 – dnkoutso

+1

如果您的應用程序在位圖上非常密集,您也可以考慮探索'largeHeap'屬性。如果啓用,畢加索將相應地調整內存。對我來說,黃金法則就是儘可能多地解碼,而不是更多。看起來你正在這樣做。我會密切關注你的使用情況。在我已經在多種設備上測試過的畢加索樣本應用程序中,我從未得到過OOM異常,看起來高端設備在清理垃圾方面處理得非常好。 – dnkoutso

+0

感謝您的建議@dnkoutso。據我所知,畢加索表現良好;當OOM確實發生時總能恢復。我會讓你張貼我的漏洞。不感興趣;我是否應該明確地關閉畢加索? – OceanLife

回答

2

首先,你需要爲位圖需要大量的記憶,對於內存分配可以通過以下方式

  1. 把所有那些龐大的圖像是減少管理存儲器分配,其在Android的一個大問題大小的資產文件夾,而不是把它們放在drawabable文件夾中。因爲可繪製資源需要內存來緩存它們。如果從資源文件夾加載,映像將無法緩存,並且佔用的內存會更少。

    1. 研究用於高效內存管理的Lrucache。
    2. 將資源以微小格式進行檢查TinyPNG
    3. 如果您的圖像分辨率過大,則嘗試使用SVG文件進行圖像加載而不是圖像加載SVG文件。檢查這個SVG FOR ANDROID

最後我不是英語非常好希望這可以幫助你。

0

這篇文章有點老了,但我最近也有過這個問題。也許這會幫助別人。 這個巨大的線程/什麼幫助我的一般概述。

- 確保您使用的是畢加索

的單一實例

- 使用合適的()

- 對於大的圖像或多個圖像或在FragmentPager/StatePager使用時,你應該使用skipmemorycache()和/或largeHeap聲明

閱讀主題獲取更多提示。在發佈這個問題時,沒有人在picassos github上發佈這個問題。

https://github.com/square/picasso/issues/305

祝你好運希望這有助於和快樂編碼。