Android避免Out of Memory問題【原創】
Android中的out of memory問題,其實跟Java中的類似。主要的原因是物件一直存在記憶體中,無法被gc清理。
在Java中記憶體物件分為強引用、軟引用、弱引用、虛引用四類。我們大多數是用的是強引用。如果一個物件具有強引用,那垃圾回收器絕不會回收它。 當記憶體空間不足,Java虛擬機器寧願丟擲OutOfMemoryError錯誤,使程式異常終止,也不會靠隨意回收具有強引用的物件來解決記憶體不足的問題。
這也是問題的關鍵。處理這種問題有三個辦法:
1、釋放強引用
其實就是在使用完物件後手動設定為null;
Object obj = new Object(); obj = null;
2、使用軟引用
軟引用是記憶體空間足夠時,垃圾回收器就不會回收它;直到虛擬機器報告記憶體不夠時才會回收, 只要垃圾回收器沒有回收它,該物件就可以被程式使用。
在jvm報告記憶體不足之前會清除所有的軟引用,這樣的話gc就可以收集到很多軟引用釋放出來的記憶體空間,從而解決記憶體吃緊的問題,避免記憶體溢位,什麼時候被回收取決於gc的演算法和gc執行時可用的記憶體大小。
SoftReference strSoft = new SoftReference(str);
3、使用弱引用
弱引用是在垃圾回收器執行緒掃描它所管轄的記憶體區域的過程中,一旦發現了只具有弱引用的物件,不管當前記憶體空間是否足夠,都會回收它的記憶體。
WeakReference<String> strWeak = new WeakReference<String>(str);
在Android中,主要可能出現Out of Memory是在處理大圖片時會出現。說到大圖,第一想到的肯定是壓縮,壓縮了有的時候還是很佔空間。但是對於圖片操作的bitmap類,是個強引用。所以在使用完之後,還要對它進行手動釋放回收。
if (!bitmapObject.isRecyled()) { bitmapObject.recycle(); System.gc(); }
還有一個問題是圖片的質量。Android中Bitmap有四種圖片色彩模式:
- ALPHA_8:每個畫素需要佔用記憶體中的1byte
- RGB_565:每個畫素需要佔用記憶體中的2byte
- ARGB_4444:每個畫素需要佔用記憶體中的2byte
- ARGB_8888:每個畫素需要佔用記憶體中的4byte
建立Bitmap時,預設的色彩模式是ARGB_8888的,這種色彩模式是質量最高的,當然這樣的模式佔用的記憶體也最大。所以我們一般為了保證質量,使用RGB_565。
轉載時請註明出處及相應連結,本文永久地址:https://blog.yayuanzi.com/25106.html
微信打賞
支付寶打賞
感謝您對作者Bob的打賞,我們會更加努力! 如果您想成為作者,請點我