Android Honeycomb中的Bitmap#recycle()是什麼?
我正在為Android Honeycomb寫一個非常記憶體密集的應用程式,我已經非常小心地儘可能地回收()未使用的點陣圖;實際上,這對於應用程式來說是必需的,因為點陣圖不斷地迴圈進出記憶體.但是,我剛剛在Activity中實現了onConfigurationChanged(),所以(由於很多原因)我正在將記憶體釋放例程放在onStop()中.
目前我的onStop()方法:
>設定一些檢視來顯示一個預設的Drawable;
>在這些檢視以前使用的點陣圖上呼叫recycle()
> nulls對Bitmap的引用.
不幸的是,使用Eclipse記憶體分析器,似乎這對記憶體使用情況沒有任何影響.
你可以想象,做了這麼多的努力,以一種名義上的垃圾收集語言來釋放資源,我本來希望有一點更多的效果.所以我的問題是:recycle()做什麼?它是否實際觸發垃圾收集,或系統是否保持記憶體 – 即使您呼叫System.gc() – 直到感覺需要擺脫某些東西?
NB我知道Bitmaps實際上不是在常規堆中,但我認為呼叫recycle()足以確保它們被從本機堆中刪除.
答案的一部分
我發現如果ImageView包含已被回收的點陣圖,Bitmap資料仍保留在記憶體中,直到在ImageView上呼叫setImageBitmap(null).如果setImageResource(…)或setImageDrawable(…)被呼叫(它們是以相對較小的九個補丁載入的),甚至可能是這種情況 – 但是,MAT分析顯示這並沒有刪除大的Bitmap,包含在ImageView的私有成員中).在onStop()上簡單地呼叫這個函式從我們的應用程式的堆中挑選了大約10MB.顯然這可能不是Android的前Honeycomb構建的情況.
正如Justin所說,Bitmap資料沒有在VM堆中分配. VM堆中有一個引用(它很小),但實際的資料由底層的Skia圖形庫在Native堆中分配. [注意這可能在以後的Android級別有所變化,但對於2.1和2.2是正確的]
當您執行將VM堆中的小部分和本機堆中的實際資料標記為可用並可用於GC的recycle()時.但實際收集由兩種不同的GC機制來執行. VM堆中的部分由Davlik GC收集 – 您可以看到通過DDMS發生.但是,本機堆資料由Skia GC收集,這似乎是懶惰的(它執行的頻率較低?).這意味著即使使用嚴格的recycle(),也可以在本地堆GC之前.
幸運的是有機制來監視本機堆的狀態.見ofollow,noindex" target="_blank">BitmapFactory OOM driving me nuts .
http://stackoverflow.com/questions/7852943/what-does-bitmaprecycle-in-android-honeycomb-actually-do