在實做取得 app icon 的時候發現記憶體使用率會飆高而且常常降不下來, 想說可能是 birmap 吃掉記憶體,所以在使用完 bitmap 後就用 recycle 來讓 GC 可以做記憶體回收,但是發現呼叫 recycle 之後再次要取得 app icon 時常常會出現 exception 說使用到已經 recycle 的 bitmap,就在想會不會是系統已經做了 app icon 的 cache,所以每次取到的 app icon 有可能是跟之前一樣的 object,這篇的說法也印證了我的猜想,系統的確會內部自己做 cache
既然不能 recycle bitmap,但記憶體又這麼高,該怎麼辦?這時發現 Android 有提供一個 LruCache 物件來做 cache,很適合 bitmap 使用,試著用用看,結果...在這樣系統跟我都做了 cache 的情況下,記憶體使用率真的變低了
為什麼兩邊都做 cache 反而記憶體會下降,我認為 Android 系統內部的 cache 機制大概有問題 ,既然系統已經內部有做 app icon 的 cache 了,應用程式端就不需要再自己做 cache 才對,cache 的使用效能與記憶體管理系統自己要注意,而不是讓應用程式來煩惱,那還不如你系統就不要做 cache,這樣我記憶體使用率可以再降一點
為了這個問題還去查了一下 PackageManager 的原始碼,才發現 PackageManager 的實作提供者有兩個 ApplicationPackageManager 和 PackageManagerService 這些物件又互相 call 來 call 去對方的 method,看了有點頭昏
恩...繼上次 activity context create PackageManager memory leak 後又一個 Android 的坑
沒有留言:
張貼留言