2012-03-16 46 views
1

我一直在這個昨天一直在掙扎,仍然無法弄清楚,所以我認爲它的時間到了這一點。所以我有一個應用程序在兩個活動中有兩個列表視圖作爲片段,每個選項卡一個。android(2.3.3/2.2) - 外部分配/ GC輸出和MAT分析

我有兩個仿真器打開:2.3.3與64 SD卡,2.2與64 SD卡

和一個設備:三星Galaxy擁有1GB的SD卡

當我在2.3.3模擬器運行: 我去第一個列表,向下滾動。每一行有一個圖像使用可以在這裏找到DrawableBackgroundDownloader類,它是從URL延遲加載:

Lazy load of images in ListView

然後我去第二個列表,並開始向下滾動。 GC已經在第一個列表中加入了,但現在它在出現前幾個項目後顯示錯誤。

這是當它開始顯示錯誤的輸出: enter image description here

了「下載圖像」指的是圖像中的線程下載如在提及類。

我在圖像控制,所以我知道,每個列表中有40項,併爲兩個列表的所有圖像都完全圍繞2MB

堆大小保持更大同小異〜3.5MB,但你可以看到外部分配上限從10MB提前跳到12MB和14244Kb,然後是16291Kb,然後是18328Kb,然後突然分配失敗。

這裏發生了什麼?

因爲這是2.3.3如果我在這裏使用MAT和分析堆轉儲。它只有2.8MB。我知道位圖不在堆中(只有引用它),因此我很難分析那裏的泄漏。反正它似乎沒有與堆,但與外部存儲器連接(GC是這麼說的,並沒有在模擬器沒有OOME)從堆

柱狀圖上的錯誤

enter image description here

當我2.2的設備上運行 - 它的工作原理和相同的操作不會導致GC失敗外部分配。 但是之後成功地第二滾動列表月末,GC樣品看起來像這樣:

03-16 15:30:25.440: D/dalvikvm(19622): GC_EXTERNAL_ALLOC freed 6910 objects/836600 bytes in 40ms 

爲什麼它被表述爲這裏的對象? 836600 =〜816kb是什麼意思?

當我在2.2模擬器上運行它時,我也得到GC錯誤,但比2.3.3更晚一點。 我會補充說,改變SD卡到512模擬器沒有區別。

我還在新到Android, 我會感謝任何提示或指出錯誤,在我的推理

回答

0

您有內存泄漏,應回收每個你不使用的圖像。也許還可以將它們縮小到每個圖像視圖的尺寸。我一直在嘮叨這個問題,我的自己太久了。如何有效管理X張圖片。跟蹤您擁有的每個位圖並知道它們何時分配給imageView,然後再回收所有其他位圖。

如果您知道有多少圖像及其尺寸,那麼您可以計算出比您在任何特定時刻處理50幅圖像的情況。

將手放在ICS手機或Honeycomp平板電腦上。位圖外部內存分配在mat中可見,你可以找出你泄漏的位置。

0

這是我後來推薦給我的東西。從來沒有使用過它,但很多人都喜歡它。 ListViewImageManager