我一直在這個昨天一直在掙扎,仍然無法弄清楚,所以我認爲它的時間到了這一點。所以我有一個應用程序在兩個活動中有兩個列表視圖作爲片段,每個選項卡一個。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已經在第一個列表中加入了,但現在它在出現前幾個項目後顯示錯誤。
這是當它開始顯示錯誤的輸出:
了「下載圖像」指的是圖像中的線程下載如在提及類。
我在圖像控制,所以我知道,每個列表中有40項,併爲兩個列表的所有圖像都完全圍繞2MB
堆大小保持更大同小異〜3.5MB,但你可以看到外部分配上限從10MB提前跳到12MB和14244Kb,然後是16291Kb,然後是18328Kb,然後突然分配失敗。
這裏發生了什麼?
因爲這是2.3.3如果我在這裏使用MAT和分析堆轉儲。它只有2.8MB。我知道位圖不在堆中(只有引用它),因此我很難分析那裏的泄漏。反正它似乎沒有與堆,但與外部存儲器連接(GC是這麼說的,並沒有在模擬器沒有OOME)從堆
柱狀圖上的錯誤
當我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, 我會感謝任何提示或指出錯誤,在我的推理